我有一个库(subx),它取决于subprocess32。 subprocess32库是Python2.7的后端,它提供了超时kwarg。
我的图书馆需要超时kwarg。
仅当目标平台是Python2.x时才需要subprocess32。
我应该如何在项目中定义依赖项?
如果我通过" install_requires"定义了对subprocess32
的依赖,我收到此错误消息(setup.py)我在python3 virtualenv中:
===> pip install -e git+https://github.com/guettli/subx.git#egg=subx
Obtaining subx from git+https://github.com/guettli/subx.git#egg=subx
Cloning https://github.com/guettli/subx.git to ./src/subx
Collecting subprocess32 (from subx)
Using cached subprocess32-3.2.7.tar.gz
Complete output from command python setup.py egg_info:
This backport is for Python 2.x only.
----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-lju3nl1y/subprocess32/
答案 0 :(得分:6)
有一种声明性的方式,但是afaik它需要一个或多或少的最新版setuptools
(如果我正确读取release notes,你至少需要20.2版本)。您将在下面看到的内容称为环境标记,并在PEP 508中指定,阅读它以获取可用标记的完整列表,并在需要时更好地理解标记语法。
对于python版本,我们以您的包为例:您应该在subprocess32
环境中安装python2.X
依赖项。像这样增强你的依赖性:
install_requires=[
'subprocess32; python_version<"3"',
]
现在使用subx
安装包python2.7
会产生:
Processing ./dist/subx-2017.8.0-py2-none-any.whl
Collecting subprocess32; python_version < "3" (from subx==2017.8.0)
Installing collected packages: subprocess32, subx
Successfully installed subprocess32-3.2.7 subx-2017.8.0
如果使用python3.X
安装,输出将为:
Processing ./dist/subx-2017.8.0-py3-none-any.whl
Installing collected packages: subx
Successfully installed subx-2017.8.0
请注意,将跳过subprocess32
的安装。
另一个常见示例是声明特定于平台的依赖项:我有一个项目需要在Linux上安装auditwheel
,在MacOS上安装delocate
。我声明了这样的依赖:
install_requires=[
...
'auditwheel==1.7.0; "linux" in sys_platform',
'delocate==0.7.1; "darwin" == sys_platform',
]
请注意,如果您没有专门针对任何主要的python版本,则需要对Linux进行检查,因为:
$ python2 -c "import sys; print sys.platform"
linux2
但
$ python3 -c "import sys; print sys.platform"
linux
因此,如果您的包仅适用于python2.X
,则可以使用支票"linux2" == sys.platform
。这将使您的依赖项仅可以python2.X
安装。
答案 1 :(得分:5)
import sys
kw = {}
if sys.version_info[0] == 2:
kw['install_requires'] = ['subprocess32']
setup(
…
**kw
)