【问题标题】:Compile C library on pip install在 pip install 上编译 C 库
【发布时间】:2017-11-17 22:18:35
【问题描述】:

我制作了一个需要执行 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},

)

这在执行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},
)

这是我的包的架构

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

注意:使用pip安装包后,我的安装文件夹(pythonx.x/site-packages/packageName)中只有__init__.py__pycache__

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

【问题讨论】:

    标签: python pip ctypes


    【解决方案1】:

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

    • 使用setuptools中的Extension编译库
    • 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],
    )
    

    【讨论】:

      【解决方案2】:

      您可以在 MANIFEST.in 中添加共享库。 像这样: include *.so *.dylib

      【讨论】:

      • 谢谢,但我想在 pip 安装期间编译库。
      • 所以你想使用 CustomInstall 而不是 CustomBuild。
      猜你喜欢
      • 2016-03-07
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-31
      • 1970-01-01
      • 1970-01-01
      • 2016-11-27
      相关资源
      最近更新 更多