2011-05-26 64 views
6

我有一个包含python包和一个编译好的组件的项目。当前目录布局:使用C扩展构建/测试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. 将蟒蛇来源一个单独的目录,例如下。 lib/foo,modules/foo等等。对于所有源文件而言,这是一个额外的目录级别,并且与没有编译扩展的项目不一致,因此它们的python包在根目录中。

  2. 将软件包保留在根目录下,这意味着将chdir带出项目根目录(例如,进入tests /目录),以便python解释程序不会看到源包(通过构建脚本或手动)。

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

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

任何一种情况都会引入一个开销与普通的python项目,其中一个可以在源代码树中修改/运行代码。我非常希望听到每个人对上述优点/缺点的想法以及您为项目使用的特定方法。

+0

我发现'build_ext --inplace'并不坏,只需将生成的'.so' /'.dll'/...文件添加到'.gitignore'(或等价物)中即可。 – letmaik 2014-06-22 15:59:15

回答

1

您可能需要尝试develop目标distribute (formerly 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'>