2017-11-17 279 views
0

我做了一个需要执行C函数的Python应用程序。为此,我使用gcc将C函数编译到共享库中,并使用ctypes在我的Python脚本中调用该库。在pip上安装编译C库

我试图在pip包中打包我的应用程序,但发现无法在pip安装时创建共享库。

我尝试以下(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}, 

python setup.py install的时候,但从PIP安装时,此工作,而安装过程是成功的,共享库是不在包文件夹(pythonx.x/site-packages/packageName)中。

我尝试使用distutils的结果相同。

基于问题Run Makefile on pip install我也试过以下setup.py:

​​

这里是我的包

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

注意的体系结构:与PIP安装包后,我只安装文件夹中有__init__.py__pycache__pythonx.x/site-packages/packageName)。

如何在pip安装期间创建共享库,以便它可以被我的包使用?

回答

0

经过数小时的研究,我找到了解决方案。存在的主要问题是:

  • 使用Extensionsetuptools编译库
  • 使用自定义安装功能git 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

所以你想使用CustomInstall而不是CustomBuild。 –