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

标签 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) - 或者是否有更好的方法来获取这些文件? (无需先安装它们)

最佳答案

你必须得到你运行的平​​台和你运行的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/

相关文章:

python - 如何捕获并发.futures._base.TimeoutError

python - Google App Engine,上传图像

python - distutils "not a regular file --skipped"

python - 使用 py2exe 创建单文件可执行文件

python - 为什么在软件包安装时有时会创建 .pth 文件?

python - Distutils 安装程序在 Mac OS X 上生成 .so 而不是 .dylib

python - Python 中等效的 Linux shell 源命令

python - 如何使用支持生成器的 Model.fit (在 fit_generator 弃用之后)

python - setuptools-scm:当前版本而不是下一版本

python - 在 setup.py 中使用 Unicode 元数据的正确方法是什么?