"No module named x.__main__; 'x' is a package and cannot be directly executed" 当使用 entry_points / console_scripts
"No module named x.__main__; 'x' is a package and cannot be directly executed" when using entry_points / console_scripts
我 this CLI tool 叫 Rackfocus。我已经发布到 PyPI,而且我有理由相信它之前工作得很好。当我在 Mac 上尝试使用 Python 的当前版本 运行 时,我收到错误消息:
No module named rackfocus.__main__; 'rackfocus' is a package
and cannot be directly executed
我想要的只是一个带有一个入口点的包,用户可以使用 pip 下载和使用。
根据教程,我在 setup.py 中有这个:
packages=['rackfocus']
entry_points = {
'console_scripts': [
'rackfocus=rackfocus.run:main'
]
}
我有一个 rackfocus.run:main
函数,一个 init.py 和所有东西。怎么了?
您可以在本地复制:
- 克隆我的存储库。
- 创建并激活 virtualenv(可选)。
pip3 install -e .
python3 -m rackfocus
entry_points = {
'console_scripts': [
'rackfocus=rackfocus.run:main'
]
}
这会告诉打包系统创建一个名为 rackfocus
的包装器可执行文件。该可执行文件将自动处理所有必要的步骤以启动 Python,找到 rackfocus
包中的 run
模块,找到它的 main
函数并调用它。
你 运行 像 rackfocus
这样的可执行文件(如果你使用的是虚拟环境,它应该已经在路径上),而不是 python -m rackfocus
.
使用 python -m rackfocus
与 完全无关(它甚至与打包没有任何关系,并且可以很容易地与没有打包的代码一起使用尚未安装)。它不使用包装器;相反,它只是尝试 执行 rackfocus
模块 。但是在您的情况下,rackfocus
不是 模块;这是一个包裹。错误消息的意思与它所说的完全一样。
您可能希望 python -m rackfocus.run
执行 run
模块 - 但当然,这仍然不会实际调用 main()
(就像它不会使用 python rackfocus/main.py
- 尽管 -m
方法 is more powerful;特别是,它允许您的相对导入工作)。
错误消息显示 rackfocus.__main__
因为您 can make a package runnable by giving it a __main__
module.
我 this CLI tool 叫 Rackfocus。我已经发布到 PyPI,而且我有理由相信它之前工作得很好。当我在 Mac 上尝试使用 Python 的当前版本 运行 时,我收到错误消息:
No module named rackfocus.__main__; 'rackfocus' is a package
and cannot be directly executed
我想要的只是一个带有一个入口点的包,用户可以使用 pip 下载和使用。
根据教程,我在 setup.py 中有这个:
packages=['rackfocus']
entry_points = {
'console_scripts': [
'rackfocus=rackfocus.run:main'
]
}
我有一个 rackfocus.run:main
函数,一个 init.py 和所有东西。怎么了?
您可以在本地复制:
- 克隆我的存储库。
- 创建并激活 virtualenv(可选)。
pip3 install -e .
python3 -m rackfocus
entry_points = {
'console_scripts': [
'rackfocus=rackfocus.run:main'
]
}
这会告诉打包系统创建一个名为 rackfocus
的包装器可执行文件。该可执行文件将自动处理所有必要的步骤以启动 Python,找到 rackfocus
包中的 run
模块,找到它的 main
函数并调用它。
你 运行 像 rackfocus
这样的可执行文件(如果你使用的是虚拟环境,它应该已经在路径上),而不是 python -m rackfocus
.
使用 python -m rackfocus
与 完全无关(它甚至与打包没有任何关系,并且可以很容易地与没有打包的代码一起使用尚未安装)。它不使用包装器;相反,它只是尝试 执行 rackfocus
模块 。但是在您的情况下,rackfocus
不是 模块;这是一个包裹。错误消息的意思与它所说的完全一样。
您可能希望 python -m rackfocus.run
执行 run
模块 - 但当然,这仍然不会实际调用 main()
(就像它不会使用 python rackfocus/main.py
- 尽管 -m
方法 is more powerful;特别是,它允许您的相对导入工作)。
错误消息显示 rackfocus.__main__
因为您 can make a package runnable by giving it a __main__
module.