【问题标题】:Setuptools: use build variants with different required packagesSetuptools:使用具有不同所需包的构建变体
【发布时间】:2020-06-10 17:14:50
【问题描述】:

我想做一个源码分发(sdist),需要根据开发和目标平台的不同包来区分。

更具体地说,当我为 Raspberry Pi(目标平台)打包时,我不需要 opencv-python,因为 OpenCV 是从那里的源代码构建的,但在开发 PC(Ubuntu)上,我需要 opencv-python

我尝试按照这样的技巧将--raspi 参数传递给setup.py

install_requires = [
    'opencv-python >= 4.1.1',
    ...
]

if "--raspi" in sys.argv:
    install_requires = [req for req in install_requires if not req.startswith('opencv-python')]
    sys.argv.remove("--raspi")

setup(
    ...,
    install_requires=install_requires
)

当我运行python3 setup.py sdist --raspi 时,这种方法的工作原理是生成的./dist/mypackage.tar.gz/mypackage/mypackage.egg-info/requires.txt 不再包含opencv-python

但是当我运行pip3 install ./dist/mypackage.tar.gz时,我仍然得到一个错误例如:

ERROR: Could not find a version that satisfies the requirement opencv-python>=4.1.1 (from mypackage==0.1) (from versions: none)

这也是我将--install-option="--raspi" 传递给pip3 install 的时候,我在某处读到它是从pip 运行时再次将参数传递给setup.py 的一种方式。

当我手动编辑分发 setup.py (./dist/mypackage.tar.gz/mypackage/setup.py) 并从所需的包中删除 opencv-python 时,pip3 安装工作。

还有其他方法可以为不同的构建设置不同的集合或要求吗?例如。使用两个不同的setup.cfg 文件(如何?),每个文件都指定他们的包集?我不太喜欢这种方法,因为我会在其中大部分重复。

【问题讨论】:

    标签: python-3.x setuptools sdist


    【解决方案1】:

    您可以使用环境标记(在PEP 508 中指定)将要求限制为特定平台:

    install_requires = [
        'opencv-python >= 4.1.1; platform_machine == "x86_64"'
    ]
    

    这将在 x86_64 架构上安装 opencv-python,但在 ARM、PPC 等上跳过它。

    【讨论】:

    • 非常好 - 完全符合我的需要。谢谢!
    【解决方案2】:

    除了@hoefling 的回答,我现在也发现了这个:

    extras_require={  # Optional
            'dev': ['check-manifest'],
            'test': ['coverage'],
        },
    

    来自pypa sampleproject。我将通过pip install sampleproject[dev] 调用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-24
      • 2016-10-16
      • 1970-01-01
      • 2019-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多