gpt4 book ai didi

python - 使用 C 扩展构建/测试 Python 项目

转载 作者:太空狗 更新时间:2023-10-30 00:18:12 25 4
gpt4 key购买 nike

我有一个项目,里面有一个 python 包和一个已编译的组件。当前目录布局为:

<project>
foo/
foo/__init__.py
foo/...

src/
src/c_foo.c

tests/
tests/test_foo.py

setup.py

构建项目时,distutils 创建一个 build/lib 目录,我将其添加到 PYTHONPATH 或安装到虚拟环境中。生成的结构如下:

<project>
build/lib
build/lib/foo/__init__.py
build/lib/foo/c_foo.so

问题在于,如果我从项目根目录启动 python 解释器 session ,从项目根目录运行测试等,它会选择源代码树而不是构建树。

我发现了几个正在使用的现有解决方案:

  1. 将 python 源放在单独的目录下,例如。 lib/foomodules/foo 等。缺点是所有源文件都有一个额外的目录级别,并且与没有编译扩展的项目不一致,因此将他们的 python 包放在根目录中。

  2. 将包保存在根目录中,这意味着必须将 chdir 移出项目根目录(例如进入 tests/目录),这样 python 解释器就看不到源包会带来不便(通过构建脚本或手动)。

  3. 使用适当的 package_dir={ 以不同的名称(例如 foo-modulefoo-lib)将包保存在根目录中setup.py 中的 'foo':'lib-foo'} 行。这是pt的变体。 1 没有额外的目录层次结构,我想这几乎是一回事。

  4. 将包保留在根目录中并使用 setup.py build_ext --inplace,但这会污染源代码树。

这两种情况都引入了开销与普通 python 项目相比,在普通 python 项目中,人们可以直接从源代码树中修改/运行代码。我非常想听听大家对上述优点/缺点的看法,以及您在项目中使用的具体方法。

最佳答案

您可能想尝试 distribute (formerly setuptools) 中的 develop 目标.

确保安装了 distribute,然后像这样修改您的 setup.py:

# the setuptools package name is still used
from setuptools import setup, Extension
...

然后进入你的virtualenv并运行develop:

% source ~/virt/bin/activate
(virt)% cd ~/project
(virt)% python setup.py develop

您应该能够从项目根目录中运行您的测试,并且只要您激活该 virtualenv,您就可以访问该项目的包和扩展,无论您的路径如何:

% cd /tmp
% source ~/virt/bin/activate
(virt)% python -c 'import foo, c_foo; print foo, c_foo'

<module 'foo' from '/Users/user/project/foo/__init__.py'>
<module 'c_foo' from '/Users/user/project/c_foo.so'>

关于python - 使用 C 扩展构建/测试 Python 项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6145637/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com