在 pip install 上编译 C 库

M-G*_*ire 3 python ctypes pip

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

我正在尝试将我的应用程序打包到 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},
Run Code Online (Sandbox Code Playgroud)

)

这在执行python setup.py install时有效,但是从 pip 安装时,当安装过程成功时,共享库不在包文件夹 ( pythonx.x/site-packages/packageName) 中。

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

基于问题Run Makefile on pip install我还尝试了以下 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},
)
Run Code Online (Sandbox Code Playgroud)

这是我的包的架构

packageName/
??? packageName/
?   ??? __init__.py
?   ??? myFunctions.c
??? MANIFEST.in
??? README.md
??? setup.py
Run Code Online (Sandbox Code Playgroud)

注意:使用 pip 安装软件包后,我在安装文件夹 ( ) 中只有__init__.py和。__pycache__pythonx.x/site-packages/packageName

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

M-G*_*ire 5

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

  • 使用Extensionfromsetuptools编译库
  • 使用自定义安装函数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],
)
Run Code Online (Sandbox Code Playgroud)