使用entry_points/console_scripts时出现“No module named x.__main__; 'x' is a package and cannot be directly executed”错误。

11

我有一个名为Rackfocus的CLI工具,地址在这里。我已经发布到PyPI,并且我相当确定它之前是可以正常运行的。但是当我尝试在Mac上使用当前版本的Python运行它时,会出现错误:

No module named rackfocus.__main__; 'rackfocus' is a package
and cannot be directly executed

我只希望有一个包含一个入口点的软件包,用户可以通过pip下载和使用。
根据教程,在setup.py中应该这样写:setup.py
packages=['rackfocus']
entry_points = {
    'console_scripts': [
        'rackfocus=rackfocus.run:main'
    ]
}

我有一个 rackfocus.run:main 函数和一个 init.py,但是出了问题。什么原因呢?

你可以在本地复现这个问题:

  1. 克隆我的 repo。
  2. 创建并激活虚拟环境(可选)。
  3. pip3 install -e .
  4. python3 -m rackfocus

问题不在于您“使用 entry_points / console_scripts”,而在于您没有这样做;或者说,您试图以一种忽略设置的方式运行程序。 - Karl Knechtel
1个回答

7
entry_points = {
    'console_scripts': [
        'rackfocus=rackfocus.run:main'
    ]
}

这告诉打包系统创建一个名为rackfocus的包装可执行文件。该可执行文件将自动处理所有必要步骤,以启动Python,找到rackfocus包中的run模块,找到其主函数并调用它。
您可以像rackfocus一样运行可执行文件(如果您正在使用虚拟环境,则应已在路径上),而不是python-m rackfocus。
使用python-m rackfocus与此完全无关(它甚至与打包无关,并且可以轻松地与尚未安装的代码一起使用)。它不使用包装器;相反,它只是尝试执行rackfocus模块。但在您的情况下,rackfocus不是模块,而是包。错误消息的意思就是它所说的。
你希望执行 run 模块,可以使用 python -m rackfocus.run 命令,但这并不会实际调用 main() 函数(就像使用 python rackfocus/main.py 命令一样,但是使用 -m 方法 更加强大,特别是它允许相对导入的工作)。
错误信息显示 rackfocus.__main__ 是因为你可以 通过给包添加一个 __main__ 模块使其可运行

谢谢,我不知道这个。原来我正在使用macOS自带的系统Python,并且PATH设置得不包含pip安装的软件包。我模糊地记得从某个地方开始推荐使用python3 -m ...来执行软件包,所以我尝试了一下。我刚刚通过Brew安装了自己的Python,然后通过那个pip3安装了我的软件包。使用这个安装程序,作为命令运行软件包是开箱即用的! - Antrikshy
“macOS自带的Python系统和PATH设置是这样的,pip安装的软件包不在其中。” 是的;我认为这是为了那些预先部署了Python的操作系统的安全功能,以便您不会干扰需要用于关键系统任务的Python安装。 "python3 -m ...是推荐的新方法,可以从某个地方执行软件包,我刚刚尝试过了。" 是的,要执行(实际可执行的)软件包(或更常见的模块),但那实际上不是你想做的事情 - Karl Knechtel
使用命令运行软件包在此安装中可以直接使用!正如我所说,您无需安装代码即可使用python -m。无论您要做什么,您都需要了解打包系统的工作原理。同时,您还应该阅读有关虚拟环境的相关知识。 - Karl Knechtel
你能举一个应该使用 python -m 调用的模块的例子吗?为什么 Rackfocus 不是可执行包?你会给它起什么名字? - Antrikshy
就像我之前所说的,rackfocus是一个软件包。它只是不可执行的。要使其可执行,您需要按照最后一个链接中描述的步骤进行操作。python -m 对于您直接调用的任何模块都很有用,例如 python whatever.py - 其差异如另一个链接所解释的那样。 - Karl Knechtel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接