【发布时间】:2019-11-13 17:02:12
【问题描述】:
作为python包开发者,运行使用入口点的控制台脚本的流程是什么?
我有一个带有setup.py 的python 项目。在里面,我有一个
entry_points={
'console_scripts': [
'myscript=mypackage.myscript.__main__:main',
]
},
如果我执行python setup.py develop,我执行最终会得到virtualenv/bin 中的包装器脚本,但是当我运行它们时会出现错误:
ImportError:找不到入口点('console_scripts'、'myscript')
(如果我这样做pip install .,上述会工作)
现在,我可以从项目顶部复制包装脚本并手动执行:
$ python
Python 3.6.8 (default, Apr 25 2019, 21:02:35)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-36)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from pkg_resources import load_entry_point
>>> load_entry_point('mypackage', 'console_scripts', 'myscript')
<function main at 0x7f7b971bcea0>
>>>
所以,我从中得到的是 virtualenv/bin/myscript 在 virtualenv 中查找包,当我从开发环境顶部手动运行它时,它会在我的当前目录中查找包。
不过,我不想把它从我的virtualenv 中用完。我不想每次想尝试修改我的脚本时都必须做pip install .。
这里的预期工作流程是什么?要手动运行python -m mypackage.myscript?我宁愿像用户一样运行它。复制 virtualenv/bin 脚本?然后它们可能会过时......
我无法在 setuptools 文档中找到开发工作流程的这一方面。
更新:
在setup.py develop 之后,我确实在我的 virtualenv 中找到了这个:
$ more virtualenv/lib/python3.6/site-packages/mypackage.egg-link
/home/me/src/mypackage.git
.
【问题讨论】:
-
通常它应该可以工作。而不是
./setup.py develop尝试pip install -e .看看是否效果更好。 -
啊——是的,这行得通。然后我
pip uninstall mypackage并重新运行setup.py develop,它仍然可以正常工作。我看看能不能复制。 -
我只能猜测我的
mypackage.egg-info/entry_points.txt已经过时了。但无法重现。 -
控制台脚本入口点只是一个 shim(由安装程序编写),它导入您的 Python 函数并运行它。它有一个与用于安装发行版的 Python 可执行文件相关联的 shebang,因此如果您在 virtualenv 中安装了包,这将是 virtualenv 的 python。 因此,您不必每次修改库代码时都重新安装 console_scripts。 您只需在添加/删除入口点时重新安装。投票结束,因为不可复制。
标签: python python-3.x setuptools