【问题标题】:Running entry point console_script in python development environment在python开发环境中运行入口点console_script
【发布时间】: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/myscriptvirtualenv 中查找包,当我从开发环境顶部手动运行它时,它会在我的当前目录中查找包。

不过,我不想把它从我的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


【解决方案1】:

按照@Iguananaut 的建议,我改为运行pip install -e .

现在可以了。

然后我做了一个pip uninstall mypackage 并再次做了一个python setup.py develop 来重现。它没有重现。

我现在明白load_entry_point 字面意思是从mypackage.egg-info 中读取entry_points.txt。我唯一的猜测是,不知何故,那个文件是坏的......并且没有通过运行 python setup.py develop 得到修复。

所以——我的问题的答案是:

要在开发环境中运行控制台脚本,请使用pip install -e . 并在virtualenv/bin/ 之外运行脚本。它被设计为以这种方式工作,如果它不这样做,那就是其他问题。

【讨论】:

  • 请注意,load_entry_point 仅用于可编辑安装。正常安装不会使用这个“hack”,它会生成一个带有库导入的正确脚本。
  • 在我的情况下,执行pip install -e . 仍然无法正常工作,并给了我一个sys.exit(load_entry_point('fitbapp', 'console_scripts', 'manage-server')()) 错误。有人可以帮忙吗?
猜你喜欢
  • 2022-01-11
  • 1970-01-01
  • 2021-11-13
  • 2012-10-16
  • 2020-09-29
  • 2020-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多