2017-11-17 1 views
0

Ich machte eine Python-Anwendung, die C-Funktionen ausführen muss. Um dies zu tun, kompilierte ich die C-Funktionen in einer gemeinsam genutzten Bibliothek mit gcc und rief die Bibliothek in meinem Python-Skript mit ctypes auf.Kompilieren C Bibliothek auf Pip installieren

Ich versuche, meine Anwendung in einem Pip-Paket zu packen, fand aber keine Möglichkeit, die gemeinsam genutzte Bibliothek nach der Pip-Installation zu erstellen.

habe ich versucht, die folgende (setup.py):

from setuptools import setup 
from setuptools.command.install import install 
import subprocess 

class compileLibrary(install): 
    def run(self): 
     install.run(self) 
     command = "cd packageName" 
     command += " && git clone https://mygit.com/myAwesomeCLibrary.git" 
     command += " && gcc -my -many -options" 
    process = subprocess.Popen(command, shell=True) 
    process.wait() 

setup(
    name='packageName', 
    version='0.1', 
    packages=['packageName'], 
    install_requires=[ 
     ... 
    ], 
cmdclass={'install': compileLibrary}, 

)

Dies funktioniert, wenn python setup.py install aber tun, wenn man von pip installieren, während der Installationsvorgang erfolgreich ist, ist die gemeinsame Bibliothek nicht im Paketordner (pythonx.x/site-packages/packageName).

Ich habe versucht, Distutils mit dem gleichen Ergebnis.

Auf der Grundlage der Frage Run Makefile on pip install Ich habe auch versucht die folgende setup.py:

from setuptools import setup 
from distutils.command.build import build 
import subprocess 


class Build(build): 
    def run(self): 
     command = "cd packageName" 
     command += " && git clone https://mygit.com/myAwesomeCLibrary.git" 
     command += " && gcc -my -many -options" 
     process = subprocess.Popen(command, shell=True) 
     process.wait() 
     build.run(self) 


setup(
    name='packageName', 
    version='0.1', 
    packages=['packageName'], 
    install_requires=[ 
     ... 
    ], 
    cmdclass={'build': Build}, 
) 

Hier ist die Architektur meiner Paket

packageName/ 
├── packageName/ 
│ ├── __init__.py 
│ ├── myFunctions.c 
├── MANIFEST.in 
├── README.md 
├── setup.py 

Hinweis: Nachdem das Paket mit pip installieren, ich nur haben Sie __init__.py und __pycache__ im Installationsordner (pythonx.x/site-packages/packageName).

Wie kann ich die shared library während der pip install erstellen, damit sie von meinem Paket verwendet werden kann?

Antwort

0

Nach Stunden der Forschung fand ich die Lösung. Die Hauptprobleme waren:

  • Verwenden Extension aus setuptools der Bibliothek
  • Verwenden Sie eine benutzerdefinierte zu kompilieren Funktion git clone installieren und den Aufruf der Konstruktor am Ende so die git clone vor der Kompilierung auftritt.

Hier ist die Arbeits setup.py:

from setuptools import setup, Extension 
from setuptools.command.install import install 
import subprocess 
import os 

class CustomInstall(install): 
    def run(self): 
     command = "git clone https://mygit.com/myAwesomeCLibrary.git" 
     process = subprocess.Popen(command, shell=True, cwd="packageName") 
     process.wait() 
     install.run(self) 

module = Extension('packageName.library', 
        sources = ['packageName/library.c'], 
        include_dirs = ['packageName/include'], 
        extra_compile_args=['-fPIC']) 

setup(
    name='packageName', 
    version='0.1', 
    packages=['packageName'], 
    install_requires=[ 
     ... 
    ], 
    cmdclass={'install': CustomInstall}, 
    include_package_data=True, 
    ext_modules=[module], 
) 
0

Sie die gemeinsam genutzte Bibliothek in MANIFEST.in hinzufügen können. wie folgt: include *.so *.dylib

+0

Vielen Dank, aber ich möchte die Bibliothek während der Pip-Installation kompilieren. –

+0

Sie möchten also CustomInstall und nicht CustomBuild verwenden. –