使用distutils编译具有未编码输出名称的纯C代码

时间:2017-06-19 16:37:02

标签: distutils

我有一个基准测试套件,它比较了编写和执行一些简单玩具Python代码的不同方法,主要是为了说明Cython。

我以前采用的方法之一是用纯C编写测试函数,用C编译器编译它(让distutils为我找到并调用编译器)然后用ctypes将库加载到Python中,并且执行功能。

这种方法很有效,直到distutils开始将python版本和平台嵌入到它生成的文件的名称中。

在过去,我可以说服distutils将名为C.c的C源文件编译到工作目录中名为C.so的库中:distutils的最新版本坚持将输出名称修改为某些内容表单build/temp.linux-x86_64-3.6或(取决于我使用的distutils功能)在该主题上的其他变量。

有没有办法说服当前版本的distutils简单地调用当前工作目录中的输出C.so? (或者,是否有一些方法可以轻松地告诉ctypes distutils生成的库所在的位置?)

[Bonus:如何在Linux,OS X和Windows上轻松表达这个想法?]

=============================================== ==================

编辑:为了完整性,以下是我以前成功完成的方法:

pure_C_setup.py

from distutils.core import setup, Extension

setup(name="ctypes-test",
      ext_modules = [Extension("C", ["C.c"])])

使用上述设置文件,用于的命令python pure_C_setup.py install --install-lib=. 在工作目录中生成C.so;今天它产生build/lib.linux-x86_64-3.6/C.cpython-36m-x86_64-linux-gnu.so

1 个答案:

答案 0 :(得分:0)

不是平台,甚至不是独立于编译器,但您可以使用Extension setup(name="ctypes-test", ext_modules = [Extension("C", ["C.c"], extra_link_args="/OUT:C.pyd")]) 来实现您想要的目标。

对于VCPP 2015:

foreach ($config["targets"] as $key => $value) {
    if ($value['name'] == "target1") {
        echo $value['apiKey'];
    }
}