在构建python扩展时,Distutils部分忽略CC环境变量

时间:2017-07-25 16:04:29

标签: python gcc setuptools distutils

我正在尝试安装subprocess32 python模块(https://github.com/google/python-subprocess32),并且遇到了一些distutils问题。该模块包含一个必须构建的C扩展,但是当我运行pip install .python setup.py install时,我得到以下输出:

...
creating build
creating build/temp.linux-x86_64-2.7
/non/existent/path/gcc -pthread -fPIC ... -c _posixsubprocess.c -o build/temp.linux-x86_64-2.7/_posixsubprocess.o
unable to execute '/non/existent/path/gcc': No such file or directory

显然,由于某些原因,distutils正在使用错误的gcc路径。然后我尝试使用export CC=/correct/path/to/gcc手动指定gcc的正确路径,我得到了这个输出:

building '_posixsubprocess' extension
creating build/temp.linux-x86_64-2.7
/correct/path/to/gcc -fPIC -fno-strict-aliasing -g -O2 ... -c _posixsubprocess.c -o build/temp.linux-x86_64-2.7/_posixsubprocess.o
/non/existent/path/gcc -pthread -shared ... build/temp.linux-x86_64-2.7/_posixsubprocess.o -o build/lib.linux-x86_64-2.7/_posixsubprocess.so
unable to execute '/non/existent/path/gcc': No such file or directory

原始有问题的命令现在正在使用正确的路径,但它仍在尝试使用不正确的gcc位置来构建共享库。我需要指定另一个环境变量来纠正这种行为吗?

2 个答案:

答案 0 :(得分:2)

我和你一起试验过完全相同的问题。我花了一些时间挖掘distutils源代码并发现了问题。

distutils将使用Python构建时的链接配置。在这种情况下,用于构建python的gcc与您用于构建扩展的gcc不同。

运行此命令也可以看到默认链接命令:

python2 "from distutils.sysconfig import get_config_var; print(get_config_var('LDSHARED'))"

你应该发现incorrent gcc在配置的开头,例如:

/non/existent/path/gcc -pthread -shared

第一种解决方案

设置LDSHARED环境变量以使用相应的gcc路径覆盖它:

export LDSHARED="/correct/path/to/gcc -pthread -shared"

然后重建扩展,它应该有效。

第二种解决方案(可能更好)

LDSHARED文件中检索lib/python2.7/_sysconfigdata.py配置,该文件是在构建时生成的。

您可以修改此文件,因此无需设置环境变量。

调试技巧

设置DISTUTILS_DEBUG环境以激活调试模式,这样您就可以在编译失败时看到回溯。

答案 1 :(得分:0)

我通过自己编译扩展,从setup.py删除对扩展名的引用,安装包然后将编译后的文件复制到正确的位置来解决这个问题。我不打算将此答案标记为已被接受,因为我确信有更好的方法..