"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 和所有东西。怎么了?

您可以在本地复制:

  1. 克隆我的存储库。
  2. 创建并激活 virtualenv(可选)。
  3. pip3 install -e .
  4. 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.