我有一个包含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解释器会话,从项目的根等运行测试,它,而不是拿起内置的源代码树树。
,我发现这几种现有解决方案中使用:
将蟒蛇来源一个单独的目录,例如下。
lib/foo
,modules/foo
等等。对于所有源文件而言,这是一个额外的目录级别,并且与没有编译扩展的项目不一致,因此它们的python包在根目录中。将软件包保留在根目录下,这意味着将
chdir
带出项目根目录(例如,进入tests /目录),以便python解释程序不会看到源包(通过构建脚本或手动)。在
setup.py
适当package_dir={'foo':'lib-foo'}
线保持在根包以不同的名称(例如foo-module
或foo-lib
)。这是pt的变体。 1没有一个额外的目录层次结构,这是几乎相同的事情,我想。将包保存在根目录下,并使用
setup.py build_ext --inplace
,但是这会污染源树。
任何一种情况都会引入一个开销与普通的python项目,其中一个可以在源代码树中修改/运行代码。我非常希望听到每个人对上述优点/缺点的想法以及您为项目使用的特定方法。
我发现'build_ext --inplace'并不坏,只需将生成的'.so' /'.dll'/...文件添加到'.gitignore'(或等价物)中即可。 – letmaik 2014-06-22 15:59:15