Python需求与PyPi冲突



我有一个项目需要一些DevOps TLC,所以我终于开始构建我的安装脚本了。这最终将是一个可以由pip在本地安装的软件包,但可能不会出现在PyPI中。

它依赖于一个名为u2py的模块。它是这个包,为U2数据库操作创建的,

而不是这个包在这种情况下,我的包的预期行为应该是什么我会在我的自述文件中包含一个关于这方面的简介,但这足够吗?

我曾想过抛出一个异常来识别何时出现了错误的包,但这让我觉得很奇怪。似乎最让人头疼的事情是不要把它添加到我的安装脚本中,盲目地假设import u2py会产生一个我可以使用的模块。如果它像鸭子一样嘎嘎作响,解析DynArray像鸭子,call()SUBROUTINE像鸭子,那么它就是鸭子,对吧?否则,如果出现错误,用户将直接阅读文档。

我看过classifiers,但不确定它们是否适用于这里。

理想情况下,在安装时(在setup.py中(会有一种方法来检测包是否安装到"u2环境"中,如果是这样的话,可能会导致安装失败(并显示相应的错误消息(。

使用此解决方案,您将无法提供构建的发行版(轮子(,因为它们在安装时不会执行setup.py文件,但只发布源发行版应该没问题。

在这种情况下,如果Python项目有名称空间(pip install com.rocket.u2pyimport com.rocket.u2py as u2py(会很好。

从我的角度来看,有两个方面需要考虑:在项目级别,在package级。

1.项目(分发包(

我认为将替代下载源强加于项目的最终用户是一种糟糕的做法。默认情况下,pip应该从PyPI下载,而不是从其他地方下载,除非用户自己决定(通过--find-links或类似选项,您可以在文档中指示用户这样做(。

由于它是一个小众依赖,我想我不会把它添加到install_requires中。我假设您的项目的最终用户已经知道依赖项,并且能够直接自己安装它。

此外,我认为在安装时不可能可靠地检查是否安装了正确的依赖项,因为setup.py并不总是运行(重写bdist_wheel命令会有所帮助,但可能不是100%有效(。

2.包装(可进口包装(

我不确定是否需要采取一些具体行动。由于模块或函数不可导入,代码很可能迟早会自然失败。哪一个可能还好吧?

但是,检测依赖项是否安装(并且它是正确的(可能相对容易,并且会提供更好的用户体验。请检查某些特定模块或功能是否可导入。或者检查元数据(import importlib_metadata; importlib_metadata.distribution('u2py').metadata['Author'](。

在应用程序的情况下,我会尽量尽快优雅地失败。如果是库,我会尝试找到一个策略点来放置检查并引发自定义异常(CannotFindU2pyException(。


链接:

  • 阻止pip缓存包
  • https://docs.python.org/3/library/importlib.metadata.html#distribution-元数据
  • https://github.com/pypa/pip/issues/4187#issuecomment-415067034
  • 相当于"setup.py"中的"--find links"`

您可以使用setuptools(需要pip 18.1或更高版本(在install_requires中指定包的url。

需求说明符

示例

设置.py

import setuptools
setuptools.setup(
name='MyPackage',
version='1.0.0',
# ...
install_requires=[
'requests @ https://github.com/psf/requests/archive/v2.22.0.zip'
]
# ...
)

并进行python setup.py install

还有

自19.1版本以来,pip还支持直接引用,如:

SomeProject@file:///somewhere/...

Ref

  • https://www.python.org/dev/peps/pep-0508/
  • https://github.com/pypa/pip/pull/4175

相关内容

  • 没有找到相关文章

最新更新