使用entry_points / console_scripts时“没有名为x.__main__的模块;'x'是一个包,无法直接执行”

Ant*_*shy 12 python pip setuptools command-line-tool pypi

我有一个名为 Rackfocus 的 CLI 工具。我已经发布到 PyPI,并且我有理由确定它之前工作得很好。当我尝试在 Mac 上使用当前版本的 Python 运行它时,出现错误:

No module named rackfocus.__main__; 'rackfocus' is a package
and cannot be directly executed
Run Code Online (Sandbox Code Playgroud)

我想要的只是一个带有一个入口点的包,用户可以使用 pip 下载和使用该包。

根据教程,我在setup.py中有这个:

packages=['rackfocus']
entry_points = {
    'console_scripts': [
        'rackfocus=rackfocus.run:main'
    ]
}
Run Code Online (Sandbox Code Playgroud)

我有一个rackfocus.run:main函数、一个init .py 等等。怎么了?

您可以在本地重现此内容:

  1. 克隆我的仓库。
  2. 创建并激活 virtualenv(可选)。
  3. pip3 install -e .
  4. python3 -m rackfocus

Kar*_*tel 9

entry_points = {
    'console_scripts': [
        'rackfocus=rackfocus.run:main'
    ]
}
Run Code Online (Sandbox Code Playgroud)

这告诉打包系统创建一个名为 的包装器可执行文件rackfocus。该可执行文件将自动处理启动 Python 所需的所有步骤,runrackfocus包中找到模块,找到其main函数并调用它。

您运行可执行文件rackfocus(如果您使用的是虚拟环境,它应该已经在路径上),而不是python -m rackfocus.

使用python -m rackfocus此完全无关(它甚至与打包没有任何关系,并且可以轻松地与尚未安装的代码一起使用)。它不使用包装器;相反,它只是尝试执行该rackfocus模块。但就你而言,rackfocus 不是一个模块;这是一个包裹。错误消息的含义与它所说的完全一样。

您可能想要python -m rackfocus.run执行该run模块 - 但当然,这实际上仍然没有调用main()(就像它不会调用一样python rackfocus/main.py- 尽管该-m方法更强大;特别是,它允许您的相对导入工作)。

错误消息显示,rackfocus.__main__因为您可以通过给包提供一个__main__module来使其可运行。