dan*_*van 14 python distutils setuptools
使用setuptools/distutils在Python中构建C库时
$ python setup.py build
Run Code Online (Sandbox Code Playgroud)
将*.so/*.pyd文件放置在build/lib.win32-2.7(或等同物).
我想在我的测试套件中测试这些文件,但我不想硬编码build/lib*路径.有没有人知道如何从distutils拉这条路径所以我可以sys.path.append(build_path)- 或者有更好的方法来获取这些文件?(没有先安装它们)
Set*_*ton 15
您必须获得正在运行的平台以及您正在运行的python版本,然后自己组装名称.
要获得当前平台,请使用sysconfig.get_platform().要获取python版本,请使用sys.version_info(特别是返回元组的前三个元素).在我的系统(使用python 2.7.2的64位Linux)上,我得到:
>>> import sysconfig
>>> import sys
>>> sysconfig.get_platform()
linux-x86_64
>>> sys.version_info[:3]
(2, 7, 2)
Run Code Online (Sandbox Code Playgroud)
lib目录的格式是"lib.platform-versionmajor.versionminor"(即只有2.7,而不是2.7.2).您可以使用python的字符串格式化方法构造此字符串:
def distutils_dir_name(dname):
"""Returns the name of a distutils build directory"""
f = "{dirname}.{platform}-{version[0]}.{version[1]}"
return f.format(dirname=dname,
platform=sysconfig.get_platform(),
version=sys.version_info)
Run Code Online (Sandbox Code Playgroud)
您可以使用它来生成任何distutils构建目录的名称:
>>> import os
>>> os.path.join('build', distutils_dir_name('lib'))
build/lib.linux-x86_64-2.7
Run Code Online (Sandbox Code Playgroud)
我发现就地编译模块最适合测试目的.这样做只需使用
python setup.py build_ext --inplace
Run Code Online (Sandbox Code Playgroud)
这将像往常一样编译临时目录中的所有辅助文件,但最终的.so文件将放在当前目录中.
这可作为命令类的build_lib成员使用build,并且它与位置相关setup.py。当你没有真正跑步时开始它setup是相当讨厌的:
import distutils.dist
import distutils.command.build
b = distutils.command.build.build(distutils.dist.Distribution())
b.finalize_options()
print(b.build_lib)
Run Code Online (Sandbox Code Playgroud)
就我个人而言,我会使用 SethMMorton 的解决方案,因为虽然如果distutils更改构建目录位置可能会很脆弱,但我怀疑如果distutils结构发生变化,玩这些技巧会更加脆弱。