使用python的setuptools / setup.py编译和安装C可执行文件?

戴夫·查利斯

我有一个python模块,它调用从C源代码构建的外部二进制文件。

该外部可执行文件的源代码是我的python模块的一部分,以.tar.gz文件的形式分发。

有没有一种方法可以解压缩,然后编译该外部可执行文件,然后使用setuptools / setup.py安装它?

我想要实现的是:

  • 将该二进制文件安装到虚拟环境中
  • 使用管理的二进制编译/安装setup.py installsetup.py build等等。
  • 使二进制模块成为我的python模块的一部分,以便可以将其作为轮子分发而无需外部依赖
戴夫·查利斯

最后通过修改setup.py为执行安装的命令添加了其他处理程序来解决

setup.py这样做的一个示例可能是:

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

def get_virtualenv_path():
    """Used to work out path to install compiled binaries to."""
    if hasattr(sys, 'real_prefix'):
        return sys.prefix

    if hasattr(sys, 'base_prefix') and sys.base_prefix != sys.prefix:
        return sys.prefix

    if 'conda' in sys.prefix:
        return sys.prefix

    return None


def compile_and_install_software():
    """Used the subprocess module to compile/install the C software."""
    src_path = './some_c_package/'

    # compile the software
    cmd = "./configure CFLAGS='-03 -w -fPIC'"
    venv = get_virtualenv_path()
    if venv:
        cmd += ' --prefix=' + os.path.abspath(venv)
    subprocess.check_call(cmd, cwd=src_path, shell=True)

    # install the software (into the virtualenv bin dir if present)
    subprocess.check_call('make install', cwd=src_path, shell=True)


class CustomInstall(install):
    """Custom handler for the 'install' command."""
    def run(self):
        compile_and_install_software()
        super().run()


setup(name='foo',
      # ...other settings skipped...
      cmdclass={'install': CustomInstall})

现在,当python setup.py install被调用时,将使用自定义CustomInstall类,然后在正常安装步骤运行之前编译并安装软件。

您也可以对感兴趣的任何其他步骤执行类似操作(例如build / develop / bdist_egg等)。

另一种选择是使compile_and_install_software()函数成为的子类setuptools.Command,并为其创建完整的setuptools命令。

这比较复杂,但是可以让您执行一些操作,例如将其指定为另一个命令的子命令(例如避免执行两次),并在命令行上将自定义选项传递给它。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

不使用setuptools解析setup.py

如何运行Nuitka编译的Python可执行文件

使用CMake编译静态可执行文件

使用NASM编译Windows可执行文件

编译所有C文件并使用Makefile创建可执行文件

在Ubuntu上编译C文件并在Windows上使用可执行文件

使用minidumps和GDB分析mingw编译的可执行文件时崩溃吗?

如何使用clang和安全堆栈标志编译可执行文件

在setup.py中使用'scripts'关键字的Python setuptools

使用 pip 安装 Windows 可执行文件

使用nsis安装可执行文件的特权

使用C#编译的可执行文件有什么?

使用LLVM构建Coreutils期间,C编译器无法创建可执行文件

如何在setup.py中包含可执行文件

在已编译的Inno Setup安装程序中修改配置文件(每个下载的可执行文件的自定义配置文件)

使用ls和grep查找可执行文件

使用Qt 5,C ++和OpenCV从Linux创建可执行文件

使用Nautilus运行C ++可执行文件

如何使用 C++ 输出可执行文件

使用pyinstaller创建的可执行文件是否需要在PC上安装Python和其他模块?

如何使用mingw-w64编译和链接32位Windows可执行文件

更改Python可执行文件

Git:使用可执行文件

使用Cython将Python代码编译为静态链接的可执行文件

使用py2exe为python代码构建可执行文件

如何使用setuptools和setup.py从软件包中排除单个文件

为什么Inno Setup跳过在某些计算机上安装可执行文件的步骤?

如何减少C API和Python可执行文件之间的执行时间差异?

可执行文件的编译过程中,是否在node / lib中使用* .js文件?