可以说我想从命令行使用gcc来编译Python的C扩展。我会构造这样的电话:

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

我注意到-I-L-l选项是绝对必要的,否则您将看到类似于this的错误。这些命令告诉gcc在哪里寻找 header (-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,我能够可靠地返回包括所有头文件的“include”目录。我仍然不知道如何获取运行时库。
distutils.ccompiler文档是here

需要此功能的程序名为Cyther

最佳答案

如果您在build_ext.py方法中从distutils查看 finalize_options 的来源,您将找到用于查找库的不同平台的代码。

关于python - 从Python内部返回include和运行时lib目录,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36341553/

10-11 16:33