Python 尽管我的包中包含编译过的库,但控制盘名称与平台无关
我正在尝试为windows生成特定于平台的二进制分发包,但是Python 尽管我的包中包含编译过的库,但控制盘名称与平台无关,python,setuptools,python-wheel,Python,Setuptools,Python Wheel,我正在尝试为windows生成特定于平台的二进制分发包,但是python setup.py bdist_wheel生成通用文件名。我需要在setup.py或其他文件中更改什么才能获得具有平台特定名称的控制盘?从我收集的信息来看,setuptools应该能够识别出一个包何时不是通用的,但这对我来说并不适用 我正在从事的项目使用cmake和MingW64编译了几个库的变体。这些编译库当然是32/64位特定的。为了创建各个发行版,我为编译库的目标平台创建了一个virtualenv。然后将编译后的库复制
python setup.py bdist_wheel
生成通用文件名。我需要在setup.py或其他文件中更改什么才能获得具有平台特定名称的控制盘?从我收集的信息来看,setuptools应该能够识别出一个包何时不是通用的,但这对我来说并不适用
我正在从事的项目使用cmake和MingW64编译了几个库的变体。这些编译库当然是32/64位特定的。为了创建各个发行版,我为编译库的目标平台创建了一个virtualenv。然后将编译后的库复制到python包中进行轮转
这是我的setup.py。pyfvs_文件是要包含的已编译“*.pyd”文件的列表。这将生成名为“pyfvs-0.0.1a0-py27-none-any.whl”的控制盘,我希望它是“pyfvs-0.0.1a0-py27-none-win32.whl”和“pyfvs-0.0.1a0-py27-none-win_amd64.whl”。当通过pip安装时,软件包的功能与目标平台的预期相同,但对于备用平台,当然会失败。最后,我希望在Windows32&64位和Linux64位上支持Python 2.7、3.4和3.5
import os
from glob import glob
from setuptools import setup
from setuptools.dist import Distribution
# TODO: Get the version from the git tag and or revision.
version = '0.0.1a0'
if os.name=='nt':
so_ext = 'pyd'
else:
so_ext = 'so'
pyfvs_files = glob('pyfvs/*.{}'.format(so_ext))
pyfvs_files.extend(['pyfvs/pyfvs.cfg',])
description = open('./README.txt').readline().strip()
long_desc = open('./README.txt').read().strip()
class BinaryDistribution(Distribution):
def is_pure(self):
return False
setup(
name='pyfvs'
, version=version
, description=description
, long_description=long_desc
, url=''
, author=""
, author_email=""
, packages=['pyfvs',]
, include_package_data=True
, distclass=BinaryDistribution
, data_files = [
('pyfvs',pyfvs_files)
, ('pyfvs/docs',glob('pyfvs/docs/*'))
, ('pyfvs/examples',glob('pyfvs/examples/*'))
, ('pyfvs/test',glob('pyfvs/test/*'))
]
, entry_points={
'console_scripts': [
'fvs=pyfvs.__main__:main'
]
}
, classifiers=[
'Development Status :: 3 - Alpha'
, 'Environment :: Console'
, 'Intended Audience :: Developers'
, 'Intended Audience :: End Users/Desktop'
, 'Intended Audience :: Science/Research'
, 'Natural Language :: English'
, 'Programming Language :: Python'
, 'Programming Language :: Fortran'
]
, keywords=''
)
我没有找到解决方案,但一个解决办法是在设置中包含一个C扩展,一个小的虚拟库就足够了,正如建议的那样。然后,Setuptools知道二进制发行版不再与平台无关,因此相应地命名了生成的轮子等。我的解决方案是继续写一个Cython扩展,提供一些有用的函数与我的包装器类集成
假设子类化分布和设置
is_pure=false
可以完成相同的任务,但事实并非如此。我没有对此进行进一步研究。如中所建议,添加has_ext_modules=true到子类分布。meI尝试了@Hebi的建议,但在setuptools 49.2.0中,我收到了错误TypeError:“bool”对象是不可调用的
。然而,根据@Hebi链接的答案中的一条注释,另一种方法确实适用于当前版本的setuptools,即传递has_ext_modules=lambda:True
。