从Python中返回include和runtime lib目录

从Python中返回include和runtime lib目录,python,gcc,static-libraries,python-c-extension,Python,Gcc,Static Libraries,Python C Extension,假设我想从命令行使用gcc,以便编译Python的C扩展。我会这样组织电话: gcc -o applesauce.pyd -I C:/Python35/include -L C:/Python35/libs -l python35 applesauce.c from subprocess import call import sys filename = applesauce.c include_directory = os.path.join(sys.exec_prefix, 'includ

假设我想从命令行使用
gcc
,以便编译Python的C扩展。我会这样组织电话:

gcc -o applesauce.pyd -I C:/Python35/include -L C:/Python35/libs -l python35 applesauce.c
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, ...])
我注意到,
-I
-L
-L
选项是绝对必要的,否则会出现类似的错误。这些命令告诉gcc在哪里查找头(
-I
),在哪里查找静态库(
-L
),以及实际使用哪个静态库(
python35
,它实际转换为
libpython35.a

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

gcc -o applesauce.pyd -I C:/Python35/include -L C:/Python35/libs -l python35 applesauce.c
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内部的解决方案,它将可靠地返回
include
libs
目录

编辑: 我查看了模块distutils.ccompiler,发现了许多有用的函数,这些函数可以部分使用distutils,但可以自定义,使编译器完全跨平台。唯一的问题是,我需要将include和runtime库传递给它

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

distutils.ccompiler
文档


需要此功能的程序名为

编译扩展的最简单方法是使用
distutils

请记住,与unix/linux相比,ms编译器的不同版本与相应的C库紧密耦合。因此,在ms windows上,您必须使用编译PythonX.y时使用的编译器编译PythonX.y的扩展。这意味着在Python 2.7、3.3和3.4中使用旧的和不受支持的工具。Python3.5的情况正在改变(,)

编辑:
在仔细研究了这个问题之后,我怀疑你想要的是100%可以实现的。根据定义,编译和链接所需的工具不属于Python,而且它们甚至不一定是Python编译时使用的工具,因此
sys
sysconfig
中的信息不能保证准确表示Python实际安装的系统。例如,大多数ms windows计算机不会安装开发人员工具。即使在POSIX平台上,安装的C编译器和构建Python的编译器之间也可能存在差异,特别是当它作为二进制软件包安装时。

如果您查看方法
finalize\u options
中from
distutils
的源代码,您会发现用于定位的不同平台的代码libs.

我已经做了很多年了,由于存在bug以及与distutils和vcvarsall.bat的各种令人痛苦的不兼容,我写了Cyther()。我的问题是Cyther当前的bug之一。我知道这是你能做到的一种方法。对不起,我不是问这个问题。哪个平台导致的问题最多?Windows、POSIX或OS-X?使用distutils进行编译,Windows给了我最困难的时间。使用Cyther,linux给了我最艰难的时光如果它“不可能”的话,
distutils
怎么做呢?如果
distutils
是完美的,我们就不会有这样的对话了。。。我并不是说这是不可能的,只是不是100%可靠。这就是我一直在寻找的。