将Python源代码拆分到单独的目录中?
以下是我的公司“foo.com”使用的一些各种 Python 包:
com.foo.bar.web
com.foo.bar.lib
com.foo.zig.web
com.foo.zig.lib
com.foo.zig.lib.lib1
com.foo.zig.lib.lib2
这是将源代码存储在磁盘上的传统方法:
pysrc/
com/
foo/
bar/
web/
lib/
zig/
web/
lib/
lib1/
lib2/
PYTHONPATH=pysrc
但出于组织目的(不同的团队、不同的版本控制等),我们希望将它们存储如下:
bar/
pysrc/
com/
foo/
bar/
web/
lib/
zig/
pysrc/
com/
foo/
zig/
web/
lib/
lib1/
lib2/
PYTHONPATH=bar/pysrc:zig/pysrc
问题是:
第二种组织方法有什么问题吗?
例如,如果我们 import com.foo
,Python 会在哪里查找 __init__.py
?
符号链接这些目录有意义吗?例如:
pysrc/
com/
foo/
bar/ -> symlink to /bar/pysrc/com/foo/
zig/ -> symlink to /zig/pysrc/com/foo/
欢迎任何一般代码组织建议。
Here are some various Python packages my company "foo.com" uses:
com.foo.bar.web
com.foo.bar.lib
com.foo.zig.web
com.foo.zig.lib
com.foo.zig.lib.lib1
com.foo.zig.lib.lib2
Here's the traditional way to store the source on disk:
pysrc/
com/
foo/
bar/
web/
lib/
zig/
web/
lib/
lib1/
lib2/
PYTHONPATH=pysrc
But for organizational purposes (different teams, different revision control, etc.), we want to store these as follows:
bar/
pysrc/
com/
foo/
bar/
web/
lib/
zig/
pysrc/
com/
foo/
zig/
web/
lib/
lib1/
lib2/
PYTHONPATH=bar/pysrc:zig/pysrc
The question is:
Are there any issues with this second method of organization?
For example, if we import com.foo
, where would Python look for the __init__.py
?
Would symlinking these directories make sense? e.g.:
pysrc/
com/
foo/
bar/ -> symlink to /bar/pysrc/com/foo/
zig/ -> symlink to /zig/pysrc/com/foo/
Any general code organizational suggestions are welcome.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
Python 将按顺序遍历 sys.path(包括 PYTHONPATH 等),在每个路径中查找 com.foo 包。它找到的第一个名称空间将用于排除其他名称空间,这与 Perl 或 Java 不同,它们有效地将包名称空间合并在一起。您可以对 __path__ 执行一些操作来更改此行为,但“第一个匹配获胜”是 Python 开箱即用的行为方式。
只要将所有 com.foo.bar 完全保留在 bar/ 中并将所有 com.foo.zig 完全保留在 zig/ 中,第二种布局就不会有任何问题。
Python will go through sys.path in order (which includes PYTHONPATH and then some), looking for a com.foo package in each. The first one it finds, it will use to the exclusion of others, unlike Perl or Java which effectively merges together package namespaces. There are things you can do to
__path__
that change this behavior, but "first match wins" is how Python behaves out of the box.As long as you keep all of com.foo.bar entirely in bar/ and all of com.foo.zig entirely in zig/, you shouldn't have any problems with the second layout.
通读 PEP 420 页面,您似乎可以添加以下内容
__init__.py
到共享包:所以你的目录结构将如下(*标记的
__init__.py
文件具有上述代码):设置python路径指向到您的
com/
目录:要测试(我在 2.7.14 和 3.6.4 上尝试过):
没有
__init__.py
代码会产生:Reading through the PEP 420 page, it looks like you can add the following
__init__.py
to the shared packages:So your directory structure would be as follows (*-marked
__init__.py
files have the above code):Set the python path to point to your
com/
directories:To test (I tried on 2.7.14 and 3.6.4):
Not having the
__init__.py
code yields: