Frage Wheel-Namen sind plattformunabhängig, obwohl mein Paket kompilierte Bibliotheken enthält


Ich versuche plattformspezifische Binärdistributionspakete für Windows zu generieren, aber python setup.py bdist_wheel generiert universelle Dateinamen. Was muss ich in meinem setup.py ändern oder sonstwie mit plattformspezifischen Namen? Von dem, was ich sammle, muss setuptools erkennen, wann ein Paket nicht universal sein wird, aber das funktioniert nicht für mich.

Das Projekt, an dem ich gerade arbeite, kompiliert mehrere Varianten von Bibliotheken mit cmake und mingw w64. Diese kompilierten Bibliotheken sind natürlich 32/64 Bit spezifisch. Um die einzelnen Distributionen zu erstellen, erstelle ich ein virtualenv für die Zielplattform, von der ich die Bibliotheken kompiliere. Die kompilierten Bibliotheken werden dann in das Python-Paket kopiert, um sie zu rotieren.

Hier ist meine setup.py. pyfvs_files ist eine Liste kompilierter * .pyd'-Dateien, die eingeschlossen werden sollen. Dies erzeugt Räder mit der Bezeichnung 'pyfvs-0.0.1a0-py27-none-any.whl', wo ich erwarten würde, dass es 'pyfvs-0.0.1a0-py27-none-win32.whl' und 'pyfvs-0.0.1a0-py27 ist -none-win_amd64.whl '. Wenn sie über Pip installiert werden, funktionieren die Pakete wie erwartet für die Zielplattform, aber sie schlagen natürlich für die alternative Plattform fehl. Letztendlich möchte ich Python 2.7, 3.4, 3.5 sowohl unter Windows 32 und 64 Bit als auch unter Linux 64 Bit unterstützen.

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

7
2018-01-23 02:51


Ursprung


Antworten:


Ich habe keine Lösung gefunden, aber ein Workaround war eine C-Erweiterung in das Setup aufzunehmen, eine kleine Dummy-Bibliothek wird ausreichen, wie vorgeschlagen Hier. Setuptools weiß dann, dass die binären Verteilungen nicht mehr plattformunabhängig sind und die resultierenden Räder usw. entsprechend benannt werden. Meine Lösung bestand darin, eine Cython-Erweiterung zu schreiben, um einige nützliche Funktionen bereitzustellen, die in meine Wrapper-Klassen integriert werden können.

Vermutlich Unterklassenverteilung und Einstellung der is_pure=false soll das gleiche erreichen, tut es aber nicht. Ich habe das nicht weiter untersucht.


2
2018-01-26 08:07