测试Python C库 - 获取构建路径

时间:2013-01-14 14:21:50

标签: python setuptools distutils

使用setuptools / distutils在Python中构建C库时

$ python setup.py build

*.so/*.pyd个文件放在build/lib.win32-2.7(或等效文件)中。

我想在我的测试套件中测试这些文件,但我宁愿不对build/lib*路径进行硬编码。有没有人知道如何从distutils中拉出这条路径所以我可以sys.path.append(build_path) - 还是有更好的方法来获取这些文件? (没有先安装它们)

4 个答案:

答案 0 :(得分:14)

您必须获得正在运行的平台以及您正在运行的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)

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)

您可以使用它来生成任何distutils构建目录的名称:

>>> import os
>>> os.path.join('build', distutils_dir_name('lib'))
build/lib.linux-x86_64-2.7

答案 1 :(得分:5)

我发现就地编译模块最适合测试目的。为此,请使用

python setup.py build_ext --inplace

这将像往常一样编译临时目录中的所有辅助文件,但最终的.so文件将放在当前目录中。

答案 2 :(得分:4)

这可以作为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)

就个人而言,我会选择SethMMorton的解决方案,因为如果distutils更改构建目录位置,它可能会很脆弱,我怀疑如果distutils结构发生变化,那么这些技巧会更加脆弱。 / p>

答案 3 :(得分:0)

@SethMMorton的方法是正确的方法。但是,使用get_platform()中的distutils.util而不是sysconfig中的import os import sys from distutils.util import get_platform def get_distutils_lib_path(): PLAT_SPEC = "%s-%d.%d" % (get_platform(), *sys.version_info[:2]) return os.path.join("build", "lib.%s" % PLAT_SPEC) 可能会更安全(即使我不知道他的版本无法运行的平台)。

这是distutils-library中的用法:

x