【问题标题】:Return the include and runtime lib directories from within Python从 Python 中返回包含和运行时 lib 目录
【发布时间】:2016-03-31 19:01:01
【问题描述】:

假设我想从命令行使用 gcc 来编译 Python 的 C 扩展。我会像这样构造调用:

gcc -o applesauce.pyd -I C:/Python35/include -L C:/Python35/libs -l python35 applesauce.c

我注意到-I-L-l 选项是绝对必要的,否则您将收到类似于this 的错误。这些命令告诉 gcc 在哪里寻找头文件(-I),在哪里寻找静态库(-L),以及实际使用哪个静态库(python35,实际上转换为libpython35.a)。

现在,如果是您的机器,显然很容易获得libsinclude 目录,因为如果您不希望它们改变它们,它们永远不会改变。然而,我正在编写一个从命令行调用gcc 的程序,其他人将使用该程序。发生此调用的行如下所示:

from subprocess import call
import sys
filename = applesauce.c
include_directory = os.path.join(sys.exec_prefix, 'include')
libs_directory = os.path.join(sys.exec_prefix, 'libs')

call(['gcc', ..., '-I', include_direcory, '-L', libs_directory, ...])

但是,其他人会有不同的平台和不同的 Python 安装结构,所以仅仅加入路径并不总是有效。

相反,我需要一个Python 中的解决方案,它能够可靠地返回includelibs 目录。

编辑:

我查看了模块distutils.ccompiler,发现了许多有用的函数,这些函数部分使用了distutils,但可以为我定制它以使我的编译器完全跨平台。唯一的事情是,我需要将包含和运行时库传递给它...

编辑 2:

我查看了distutils.sysconfig,我能够可靠地返回包含所有头文件的“包含”目录。我仍然不知道如何获取运行时库。

distutils.ccompiler 文档是 here

需要这个功能的程序被命名为Cyther

【问题讨论】:

    标签: python gcc static-libraries python-c-extension


    【解决方案1】:

    编译扩展最简单的方法是使用distutils,like this;

    from distutils.core import setup
    from distutils.extension import Extension
    setup(name='foobar',
          version='1.0',
          ext_modules=[Extension('foo', ['foo.c'])],
          )
    

    请记住,与 unix/linux 相比,compiling extensions on ms-windows is not straightforward 因为不同版本的 ms 编译器与相应的 C 库紧密耦合。因此,在 ms-windows 上,您必须使用编译 Python x.y 的相同编译器来编译 Python x.y 的扩展。这意味着使用旧的和不受支持的工具,例如Python 2.7、3.3 和 3.4。 Python 3.5 正在改变这种情况(part 1part 2)。

    编辑: 更多地研究了这个问题,我怀疑你想要的东西是 100% 可以实现的。鉴于编译和链接所需的工具是在 Python 之外定义的,而且它们甚至不一定是编译 Python 时使用的工具,syssysconfig 中的信息不能保证准确表示系统实际上安装了Python。例如。大多数 ms-windows 机器不会安装开发者工具。即使在 POSIX 平台上,安装的 C 编译器和构建 Python 的编译器之间也可能存在差异,尤其是当它作为二进制包安装时。

    【讨论】:

    • 多年来我一直这样做,但由于错误以及与 distutils 和 vcvarsall.bat 的各种痛苦不兼容,我编写了 Cyther (pypi.python.org/…)。我的问题是 Cyther 中当前的错误之一。我知道这是你可以做到的一种方式。抱歉,我不是在问这个问题。
    • 哪个平台导致的问题最多? Windows、POSIX 还是 OS-X?
    • 使用distutils编译,windows给了我最难的时候。使用 Cyther,linux 给了我最艰难的时光
    • 如果“不可能”,distutils 会怎么做呢
    • 好吧,如果distutils 是完美的,我们就不会进行这次对话了……我并不是说这不可能,只是不是 100% 可靠
    【解决方案2】:

    如果您在方法finalize_options 中从distutils 查看build_ext.py 的源代码,您会发现用于定位库的不同平台的代码。

    【讨论】:

    • 这就是我要找的。​​span>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-23
    • 2013-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多