使用 setuptools/distutils 在 Python 中构建 C 库时
$ python setup.py build
*.so/*.pyd
文件放置在 build/lib.win32-2.7
(或等同物)中。
我想在我的测试套件中测试这些文件,但我不想对 build/lib*
路径进行硬编码。有谁知道如何从 distutils 中提取这条路径以便我可以 sys.path.append(build_path)
- 或者是否有更好的方法来获取这些文件? (无需先安装它们)
最佳答案
你必须得到你运行的平台和你运行的python版本,然后自己组装名字。这是 setuptools 的内部细节(基于 distutils 的捆绑版本),因此不保证稳定。
要获取当前平台,请使用 sysconfig.get_platform()
.要获取 python 版本,请使用 sys.version_info
(特别是返回元组的前三个元素)。在我的系统上(64 位 linux 和 python 2.7.2)我得到:
>>> import sysconfig
>>> import sys
>>> sysconfig.get_platform()
linux-x86_64
>>> sys.version_info[:3]
(2, 7, 2)
setuptools 62.1 之前
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)
安装工具 62.1 之后
上面的目录与 PyPy 等替代 python 实现冲突,因此使用 sys.implementation.cache_tag
使内部构建目录更加具体. lib目录的格式为"lib.<platform>-<cachetag>"
.您可以使用 python 的字符串格式化方法构造此字符串:
def distutils_dir_name(dname):
"""Returns the name of a distutils build directory"""
f = "{dirname}.{platform}-{cache_tag}"
return f.format(dirname=dname,
platform=sysconfig.get_platform(),
cache_tag=sys.implementation.cache_tag)
您可以使用它来生成任何 distutils 构建目录的名称:
>>> import os
# Before Setuptools 62.1
>>> os.path.join('build', distutils_dir_name('lib'))
build/lib.linux-x86_64-3.9
# After Setuptools 62.1
>>> os.path.join('build', distutils_dir_name('lib'))
build/lib.linux-x86_64-cpython39
请注意,Setuptools 62.1 仅适用于 Python 3.7+。此外,如果您设置 SETUPTOOLS_USE_DISTUTILS=stdlib
在您的环境中,那么即使在 Setuptools 62.1 中,您也会得到旧的行为。
关于python - 测试 Python C 库 - 获取构建路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14320220/