Приложение Python работает при установке через pip, но не при непосредственном запуске - PullRequest
1 голос
/ 09 мая 2019

Мне нужна помощь в настройке структуры каталогов для приложения на Python. Это приложение командной строки (с помощью Click, если это имеет значение).

Моя структура каталогов выглядит так:

mycli
├── mycli
│   ├── cli.py
│   ├── __init__.py
│   └── mycli.py
└── setup.py

В mycli/mycli/__init__.py У меня есть одна строка кода:

__application__ = "my-cli"

В mycli/mycli/cli.py У меня есть это:

from mycli import __application__
import click
import sys

@click.group()
def my_cli():
    """ rest of my code """

if __name__ == "__main__":
    sys.exit(my_cli())

Наконец, в моем setup.py я добавил точку входа, чтобы я мог использовать это приложение в командной строке:

entry_points={
    'console_scripts': [
        'my-cli=mycli.cli:my_cli',
    ],
},

Я могу установить приложение, используя pip install -e ., а затем выполнить my-cli, как и ожидалось. Это работает.

У меня проблема в том, что я тоже хочу запустить python mycli/cli.py. Это полезно для отладки. Не удается прочитать __application__, хотя:

$ python mycli/cli.py 
Traceback (most recent call last):
  File "mycli/cli.py", line 1, in <module>
    from mycli import __application__
ImportError: cannot import name '__application__'

Что мне нужно сделать с моим макетом проекта, чтобы я мог продолжать использовать entry_points в setup.py И иметь возможность запускать мое приложение с python mycli/cli.py?

Я пытался изменить импорт на

from .mycli import __application__

Но я получаю эти ошибки:

при работе python mycli/cli.py

ModuleNotFoundError: No module named '__main__.mycli'; __main__ is not a package

Точка входа разрывается на:

ImportError: cannot import name '__application__'

1 Ответ

1 голос
/ 10 мая 2019

Ваша проблема - конфликтующее пространство имен.Ваша программа имеет то же имя, что и ваш модуль.Итак:

from mycli import __application__ 

пытается импортировать из mycli.py, а не из mycli/__init__.py.Я предлагаю вам переименовать ваш скрипт в my-cli.py.

...