python-3.x - Setuptools:使用具有不同所需包的构建变体
问题描述
我想制作一个源分发(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
时,我在某处读到的将是setup.py
从 运行时再次传递参数的一种方式pip
。
当我手动编辑分发setup.py
( ./dist/mypackage.tar.gz/mypackage/setup.py
) 并opencv-python
从所需的包中删除时,pip3 安装工作。
还有其他方法可以为不同的构建设置不同的集合或要求吗?例如,使用两个不同的setup.cfg
文件(如何?),每个文件指定他们的包集?我不太喜欢这种方法,因为我在这些方法中大部分都是重复的。
解决方案
您可以使用环境标记(如PEP 508中指定)将要求限制为特定平台:
install_requires = [
'opencv-python >= 4.1.1; platform_machine == "x86_64"'
]
这将安装opencv-python
在 x86_64 架构上,但在 ARM、PPC 等上跳过它。
推荐阅读
- excel - 当我尝试录制宏时,Excel 2016 会自行重启
- python - 如何提取张量流模型的输出?
- android - 自定义视图:在滚动视图内滑动
- python - Google Cloud ML 上传训练模型:输出的外部维度必须未知
- android - 使用 firebase 实时数据库或 firestore 为社交媒体平台设置 rss feed 或 feed
- java - 通过匹配另外两个列表中的条目来创建新的 Java 对象列表
- sql-server - SQL Exists 返回比 IN 更多的记录
- r - 按时间顺序匹配和减去
- .net - HttpClient 为 https 请求强制使用端口 80
- c# - 当列表中基础项目的属性发生更改时更新计算的总计 - wpf