从Python中返回包含和运行时lib目录

Nic*_*lfi 5 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
Run Code Online (Sandbox Code Playgroud)

我注意到-I,-L-l选项是绝对必要的,否则你会得到类似如下的错误.这些命令告诉gcc在哪里查找headers(-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, ...])
Run Code Online (Sandbox Code Playgroud)

但是,其他人将拥有不同的平台和不同的Python安装结构,因此只是加入路径并不总是有效.

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

编辑:

我查看了该模块distutils.ccompiler,发现了许多有用的函数,它们部分地使用了distutils,但是让我可以自定义我的编译器完全跨平台.唯一的问题是,我需要传递包含和运行时库...

编辑2:

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

distutils.ccompiler文档是在这里

需要此功能的程序名为Cyther

Rol*_*ith 5

编译扩展的最简单方法是使用distutils,像这样 ;

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

请记住,与unix/linux相比,在ms-windows上编译扩展并不简单,因为ms编译器的不同版本与相应的C库紧密耦合.因此,在ms-windows上,你必须使用编译Python xy的相同编译器编译Python xy的扩展.这意味着使用旧的和不受支持的工具,例如Python 2.7,3.3和3.4.Python 3.5 的情况正在发生变化(第1部分,第2部分).

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


tot*_*oro 1

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