2017-11-17 14 views
0

C 함수를 실행해야하는 Python 응용 프로그램을 만들었습니다. 이렇게하기 위해 gcc를 사용하여 공유 라이브러리에서 C 함수를 컴파일하고 ctypes를 사용하여 파이썬 스크립트에서 라이브러리를 호출했습니다.pip 설치시 C 라이브러리 컴파일

나는 pip 패키지에 내 응용 프로그램을 포장하려하지만 pip 설치시 공유 라이브러리를 만들 수있는 방법이 없습니다. 설치 프로세스가 성공하면서, 공유 라이브러리가 아닌,

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}, 

) 핍에서 설치할 때,하지만 python setup.py install을 할 때이 작동

:

나는 다음 (setup.py를) 시도 패키지 폴더 ( pythonx.x/site-packages/packageName)에 있습니다.

동일한 결과를 가진 distutils를 사용해 보았습니다. 여기

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}, 
) 

내 패키지

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

주의 아키텍처 : 질문 Run Makefile on pip install을 바탕으로

은 또한 다음과 같은 setup.py를 시도 핍으로 패키지를 설치 한 후, 나는 단지 설치 폴더 ( pythonx.x/site-packages/packageName)에 __init__.py__pycache__이 있어야합니다.

내 패키지에서 사용할 수 있도록 pip 설치 중에 공유 라이브러리를 어떻게 만들 수 있습니까?

답변

0

연구 시간이 지나자 해결책을 찾았습니다. 주요 문제가 있었다 : setuptools에서

  • 사용 Extensiongit clone에 기능을 설치하고이 때문에 git clone 컴파일 전에 발생 끝에 생성자 를 호출 라이브러리
  • 사용을 사용자 정의를 컴파일 할 수 있습니다. 여기

는 작업 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

당신이 MANIFEST.in에서 공유 라이브러리를 추가 할 수 있습니다. 은 다음과 같습니다 : include *.so *.dylib

+0

감사합니다. 그러나 pip 설치 중에 라이브러리를 컴파일하고 싶습니다. –

+0

CustomBuild가 아닌 CustomInstall을 사용하려고합니다. –