当 setup.py 使用 Python 版本 3 解释器运行时,如何构建 py2 wheel 包?
How do I build a py2 wheel package, when setup.py runs with a Python version 3 interpreter?
我有一个包应该是 Python 版本 2 但需要构建 运行 版本 3 解释器。
这个包的 setup.py
看起来像 hits:
from setuptools import setup
setup(
python_requires="<3.0, >=2.7.5",
classifiers=[
'Programming Language :: Python :: 2',
'Intended Audience :: Developers',
],
# ... more keyword arguments ...
)
如果我调用 python2 setup.py build bdist_wheel
,我得到:
$ ls dist
mypackage-0.3.dev14-py2-none-any.whl
如果我 运行 使用版本 3 解释器,即 python3 setup.py build bdist_wheel
,我得到:
$ ls dist
mypackage-0.3.dev14-py3-none-any.whl
我本以为无论解释器版本如何,我都会得到一个 py2 包,因为我用 python_requires
(并在标签中)指定了它。我的包构建服务器只有一个 Python 3 解释器。
当使用 Python 3 解释器 运行ning setuptools 时,如何构建一个以 Python 2 为目标的轮子?这可能吗?文件名中的 -py3-
/-py2
是否与我认为的不同?
从 修改而来,对 setup.py
的这种更改似乎有效。
但我怀疑可能有更简单的方法。
from setuptools import setup
try:
from wheel.bdist_wheel import bdist_wheel as _bdist_wheel
class bdist_wheel(_bdist_wheel):
def finalize_options(self):
_bdist_wheel.finalize_options(self)
self.root_is_pure = False # Mark us as not a pure python package
def get_tag(self):
python, abi, plat = _bdist_wheel.get_tag(self)
python, abi = 'py2', 'none' # python, abi, plat = 'py2', 'none', 'any'
return python, abi, plat
except ImportError:
bdist_wheel = None
setup(
cmdclass={'bdist_wheel': bdist_wheel}
# ... other keyword args ...
)
编辑:
有了这个解决方案,平台 (plat
) 似乎发生了变化,因为生成的文件名以 -py2-none-linux_x86_64.whl
.
结尾
我怀疑这是 self.root_is_pure = False
的结果。由于我的包中没有二进制文件,我认为将平台设置为 any
ant pure 到 True
.
是安全的
编辑2:
另一个可能的解决方案:
import sys
import setuptools
if 'bdist_wheel' in sys.argv:
if not any(arg.startswith('--python-tag') for arg in sys.argv):
sys.argv.extend(['--python-tag', 'py2'])
setuptools.setup(
# ...
)
尝试将 python-tag 参数传递给 bdist_wheel:
python setup.py bdist_wheel --python-tag=py2
它也可以传递为
from setuptools import setup
setup(options={'bdist_wheel':{'python_tag':'py2'}})
或在setup.cfg
我有一个包应该是 Python 版本 2 但需要构建 运行 版本 3 解释器。
这个包的 setup.py
看起来像 hits:
from setuptools import setup
setup(
python_requires="<3.0, >=2.7.5",
classifiers=[
'Programming Language :: Python :: 2',
'Intended Audience :: Developers',
],
# ... more keyword arguments ...
)
如果我调用 python2 setup.py build bdist_wheel
,我得到:
$ ls dist
mypackage-0.3.dev14-py2-none-any.whl
如果我 运行 使用版本 3 解释器,即 python3 setup.py build bdist_wheel
,我得到:
$ ls dist
mypackage-0.3.dev14-py3-none-any.whl
我本以为无论解释器版本如何,我都会得到一个 py2 包,因为我用 python_requires
(并在标签中)指定了它。我的包构建服务器只有一个 Python 3 解释器。
当使用 Python 3 解释器 运行ning setuptools 时,如何构建一个以 Python 2 为目标的轮子?这可能吗?文件名中的 -py3-
/-py2
是否与我认为的不同?
从 setup.py
的这种更改似乎有效。
但我怀疑可能有更简单的方法。
from setuptools import setup
try:
from wheel.bdist_wheel import bdist_wheel as _bdist_wheel
class bdist_wheel(_bdist_wheel):
def finalize_options(self):
_bdist_wheel.finalize_options(self)
self.root_is_pure = False # Mark us as not a pure python package
def get_tag(self):
python, abi, plat = _bdist_wheel.get_tag(self)
python, abi = 'py2', 'none' # python, abi, plat = 'py2', 'none', 'any'
return python, abi, plat
except ImportError:
bdist_wheel = None
setup(
cmdclass={'bdist_wheel': bdist_wheel}
# ... other keyword args ...
)
编辑:
有了这个解决方案,平台 (plat
) 似乎发生了变化,因为生成的文件名以 -py2-none-linux_x86_64.whl
.
我怀疑这是 self.root_is_pure = False
的结果。由于我的包中没有二进制文件,我认为将平台设置为 any
ant pure 到 True
.
编辑2:
另一个可能的解决方案:
import sys
import setuptools
if 'bdist_wheel' in sys.argv:
if not any(arg.startswith('--python-tag') for arg in sys.argv):
sys.argv.extend(['--python-tag', 'py2'])
setuptools.setup(
# ...
)
尝试将 python-tag 参数传递给 bdist_wheel:
python setup.py bdist_wheel --python-tag=py2
它也可以传递为
from setuptools import setup
setup(options={'bdist_wheel':{'python_tag':'py2'}})
或在setup.cfg