通过pip安装时,Python应用程序有效,但直接运行时则无效

时间:2019-05-09 14:02:56

标签: python python-click

我需要帮助来设置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

entry_point的开头是:

ImportError: cannot import name '__application__'

1 个答案:

答案 0 :(得分:1)

您的问题是名称空间冲突。您的程序与模块具有相同的名称。所以:

from mycli import __application__ 

尝试从mycli.py而不是从mycli/__init__.py导入。建议您将脚本重命名为my-cli.py