Python CLI 应用程序在从 PyPI 安装时不运行,在本地安装时运行良好
Posted
技术标签:
【中文标题】Python CLI 应用程序在从 PyPI 安装时不运行,在本地安装时运行良好【英文标题】:Python CLI application does not run when installed from PyPI, runs fine when installed locally 【发布时间】:2019-03-12 13:55:22 【问题描述】:假设我正在开发一个名为 Example 的命令行应用程序,它的调用命令是 example
。我写了一个 setup.py,看起来像这样:
import setuptools
setuptools.setup(
name='example',
version='1.0',
entry_points =
'console_scripts': [
'example=example.run:main'
]
,
...
)
此文件与名为 example
的模块位于同一级别(包含 __init__.py
和所有内容。其中有一个 run.py
和一个 main
函数。
当我将这个正在进行中的项目安装为符号链接时,使用...
pip3 install -e .
...它工作正常。我可以使用example
命令从任何地方运行它。
但是当我关注 these instructions 将其上传到 PyPI 时,然后使用...安装它...
pip3 install example
...它说...
Traceback (most recent call last):
File "/usr/local/bin/example", line 7, in <module>
from example.run import main
ModuleNotFoundError: No module named 'example'
当然这个项目实际上并不叫example
;它的名字没有任何冲突。
【问题讨论】:
这不是一个完整的错误回溯——您遗漏了实际的错误消息。 哎呀!已编辑。 【参考方案1】:如果你想从文件 example.py
安装一个模块 example
你
需要将其作为 Python 模块添加到setup.py
:
setuptools.setup(
…
py_modules=['example'],
…
)
如果example
是来自目录example/
的包,你
需要将其添加为一个包:
setuptools.setup(
…
packages=['example'],
…
)
如果example
有来自example/*/
子目录的子包,你
需要列出所有子包:
setuptools.setup(
…
packages=['example', 'example.sub1', 'example.sub2'],
…
)
您可以让setuptools
列出您的所有子包:
setuptools.setup(
…
packages=setuptools.find_packages()
…
)
【讨论】:
以上是关于Python CLI 应用程序在从 PyPI 安装时不运行,在本地安装时运行良好的主要内容,如果未能解决你的问题,请参考以下文章
如何将 PEP 517 和 PEP 518 用于本地可用(不在 PYPI 上)系统范围的 CLI Python 脚本
Systemd 服务不会将 python 脚本写入文件,python 脚本在从 cli 执行时名义上运行