【问题标题】:Unable to load python entry_point when developing python package开发python包时无法加载python entry_point
【发布时间】:2017-12-22 10:13:52
【问题描述】:

我正在尝试开发一个可导入的 python 包,并且还具有可从 shell 调用的 entry_point。

当尝试调用入口点时,我得到: pkg_resources.VersionConflict: (pysec-aws 0.1.dev1 (/Users/myuser/PycharmProjects/pysec-aws), Requirement.parse('pysec-aws==0.1.dev0'))

基本上我在收到此错误之前所做的是将 setup.py 中的版本从0.1.dev0 增加到0.1.dev1,然后运行python setup.py sdist 然后pip install -e .

我做错了什么?安装您正​​在积极开发并与 setuptools 捆绑的软件包的开发版本的正确方法是什么?

【问题讨论】:

  • pysec-aws 包本身或依赖于它的其他包启动代码时,您是否收到此错误?此外,完整的错误跟踪以及 setup.py 骨架会很好。
  • 我的猜测是你有一些其他的包声明了pysec-aws 的入口点并声明了对pysec-aws 的确切版本0.1.dev0 的依赖。现在你将pysec-aws 撞到0.1.dev1,所以另一个包不再有有效的依赖关系,这就是pkg_resources 加载入口点时检查的内容。

标签: python pip setuptools entry-point


【解决方案1】:

错误是抱怨应用程序版本与 setup.py 中声明的版本不匹配。尝试检查您的应用程序中设置的__version__

您可以考虑为版本使用单一来源以避免此问题。 https://packaging.python.org/guides/single-sourcing-package-version/ 列出了许多不同的选项。如果没有任何外部依赖,一种简单的技术是

import myapp
setup(
    ...
    version=myapp.__version__
    ...
)

【讨论】:

  • 我没有清单文件,但我有包依赖项。 __version__ 应该在哪里定义?
  • 我将__version__='0.1dev1' 添加到我的__init__.py 文件中,并在您提供的链接中使用了第一种技术。包像以前一样构建和安装,但是当我尝试从 shell 调用 entry_point 时,我得到了同样的错误
  • @EytanAvisror by manifest 我的意思是 setup.py 声明的版本。我会解决的。至于错误,您的项目中是否还有对 0.1.dev0 的引用? (请注意,您的评论引用版本中似乎丢失了一个句号)
  • 在任何地方都没有对 dev0 的引用。顺便说一下,当我将 __version__ 改回 0.1.dev0 并安装它时,它就可以工作了。
  • 我不确定,抱歉。唯一想到的另一件事是 packaging.python.org/guides/multi-version-installs 之类的东西,如果您之前有安装剩余但我不知道它是否会导致此错误。
【解决方案2】:

解决此问题的唯一方法是创建一个新的 virtualenv。

显然我的virtualenv/bin 出于某种原因已编译 (.pyc) 和未编译 (.py) 对旧版本的引用 - 当我安装新版本时,它们可能没有升级/删除。

一旦我创建了一个新的 virtualenv 并重新安装了所需的包,我就能够解决这个问题。

【讨论】:

  • 啊,很高兴听到您解决了问题。在您的情况下,您提到了源代码和编译源代码。值得一提的是,我曾经遇到过一个案例,其中仅剩的 .pyc(与 venv 无关)导致了问题。我忘记了细节,但我认为我通过一些不协调的 grep 结果发现了这个问题。
猜你喜欢
  • 2015-04-10
  • 2020-09-14
  • 1970-01-01
  • 1970-01-01
  • 2014-11-01
  • 1970-01-01
  • 2021-08-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多