我们有一个占位符egg,它不包含任何代码,只是为了从PyPi存储库中提取依赖包列表而存在。
这些依赖包中的大多数都是与平台无关的,但有些只在Win32平台上使用。
是否有可能以某种方式使依赖平台 - 条件化,以便我的install_requires
列表中的给定依赖项只会在Win32上安装时被拉下来?
另外:是否可以指定可选依赖项列表,如果可用,将会安装这些依赖项,但如果不是,则不会导致easy_install
失败?
答案 0 :(得分:19)
请参阅https://stackoverflow.com/a/32955538/875667了解轮子
这对于sdist或egg释放来自:http://setuptools.readthedocs.io/en/latest/setuptools.html#declaring-platform-specific-dependencies
有时,项目可能需要依赖项才能在特定平台上运行。这可能是一个包返回端口模块,以便它可以在较旧的python版本中使用。或者它可能是在特定操作系统上运行所需的包。这将允许项目在多个不同平台上工作,而无需安装安装项目的平台不需要的依赖项。
setup(
name="Project",
...
install_requires=[
'enum34;python_version<"3.4"',
'pywin32 >= 1.0;platform_system=="Windows"'
]
)
答案 1 :(得分:12)
在setup.py
:
from setuptools import setup
import sys
setup(
name="...",
install_requires=["This", "That"] + (
["WinOnly", "AnotherWinOnly"] if sys.platform.startswith("win") else []
)
)
如果您需要, distutils.util.get_platform
提供的信息比sys.platform
更多:
>>> sys.platform
'linux2'
>>> distutils.util.get_platform()
'linux-i686'
答案 2 :(得分:4)
使用extras_require
分发选项使'win32 support'成为可选功能:
setup(
...
extras_require={
'win32': 'pywin32'
},
...
)
然后在Windows上安装时指定win32功能:
easy_install mypackage[win32]
这将下拉pywin32
包,该包被列为mypackage的'win32'功能的依赖项。
有关可选功能的详情,请参阅here。
答案 3 :(得分:1)
当构建蛋时(使用python setup.py bdist_egg
),您可以强制setuptools / distribute来构建特定于平台的蛋。
from setuptools import setup
import os
# Monkey-patch Distribution so it always claims to be platform-specific.
from distutils.core import Distribution
Distribution.has_ext_modules = lambda *args, **kwargs: True
requirements = ['generic-foo', 'generic-bar']
if os.getenv('WINDOWS_BUILD'):
requirements.extend(['a-windows-only-requirement'])
setup(
name="...",
install_requires=requirements
)
然后你可以简单地做:
# Force a windows build
$ WINDOWS_BUILD=y python setup.py bdist_egg -p win32
# Do a linux build -- you may not need to specify -p if you're happy
# with your current linux architecture.
$ python setup.py bdist_egg -p linux-i686