6

我有一个项目,其中包含一个 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 解释器会话,从项目根目录运行测试等,它会选择源代码树而不是构建树。

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

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

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

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

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

这两种情况都引入了开销,而不是一个可以直接从源代码树修改/运行代码的普通 python 项目。我非常想听听大家对上述优点/缺点的看法,以及您在项目中使用的特定方法。

4

1 回答 1

1

您可能想尝试分发中的develop目标(以前称为 setuptools)

确保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'>
于 2011-05-26T22:50:30.773 回答