即使我的包包含已编译的库,轮名也是平台无关的

时间:2016-01-23 02:51:22

标签: python setuptools python-wheel

我正在尝试为Windows生成特定于平台的二进制分发包,但python setup.py bdist_wheel生成通用文件名。我需要在setup.py或其他方面更改以获得具有平台特定名称的轮子?从我收集的setuptools应该知道什么时候一个包不会普遍,但这对我不起作用。

我正在开发的项目使用cmake和mingw w64编译了几个库的变体。这些编译库当然是32/64位特定的。为了创建单独的发行版,我为目标平台创建了一个virtualenv,我可以从中编译库。然后将编译好的库复制到python包中以进行轮转。

这是我的setup.py。 pyfvs_files是要包含的已编译的'* .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安装时,软件包按目标平台的预期运行,但当然对备用平台失败。最终,我想在Windows 32和Windows 32上支持Python 2.7,3.4,3.5。 64位和linux 64位。

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=''
    )

1 个答案:

答案 0 :(得分:2)

我找不到任何解决方案,但是解决方法是在设置中包含C扩展,一个小的虚拟库就足够了,如建议here。然后,Setuptools知道二进制分布不再是平台独立的,并且生成的轮子等被恰当地命名。我的解决方案是继续编写一个Cython扩展,以提供一些有用的功能,以便与我的包装类集成。

推测子类化分布和设置is_pure=false应该完成同样的事情,但它并没有。我没有进一步调查过这个问题。