我需要帮助来设置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__'
答案 0 :(得分:1)
您的问题是名称空间冲突。您的程序与模块具有相同的名称。所以:
from mycli import __application__
尝试从mycli.py
而不是从mycli/__init__.py
导入。建议您将脚本重命名为my-cli.py
。