我有一个项目,其中包含一个 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 解释器会话,从项目根目录运行测试等,它会选择源代码树而不是构建树。
我在使用中发现了几个现有的解决方案:
将 python 源代码放在单独的目录下,例如。
lib/foo
等modules/foo
。缺点是所有源文件都有一个额外的目录级别,并且与没有编译扩展的项目不一致,因此它们的 python 包位于根目录中。将包保存在根目录中,这意味着必须
chdir
退出项目根目录(例如进入 tests/ 目录),以便 python 解释器看不到源包(通过构建脚本或手动)。foo-module
将包以不同的名称(例如或foo-lib
)保存在根目录中,并package_dir={'foo':'lib-foo'}
在setup.py
. 这是 pt 的变体。1 没有额外的目录层次结构,我想这几乎是一回事。将包保存在根目录中并使用
setup.py build_ext --inplace
,但这会污染源代码树。
这两种情况都引入了开销,而不是一个可以直接从源代码树修改/运行代码的普通 python 项目。我非常想听听大家对上述优点/缺点的看法,以及您在项目中使用的特定方法。