我习惯了一种脚本语言,在这种语言中,通常会像这样布置模块:
lib/Foo.pm
lib/Foo/Bar.pm
lib/Foo/Baz.pm
在拥有Foo.pm的位置,然后有一个名为Foo的目录,并在其下放置子模块。
在Python中,我试图模仿布局,如下所示:
modules/foo.py
modules/foo/bar.py
modules/foo/baz.py
但是,这不起作用,因为当我这样做时:
from foo import Foo
Python认为我正在导入一个名为“ foo”的目录,而不是foo.py。我试图使init .py业务混乱,但无济于事。
有没有办法解决这个问题?我感到很烦人的是,Python无法区分目录foo和文件foo.py。
编辑:我想我错过了重要的一块。我通过单元测试来采购modules /目录,因此整个目录结构如下所示:
modules/foo.py
modules/foo/bar.py
modules/foo/baz.py
tests/unit.py
在unit.py中,我具有以下内容:
#!/usr/bin/python
import sys
import os
findbin = os.path.abspath(os.path.dirname(sys.argv[0]))
sys.path.append(findbin + "/../modules")
from foo import Foo
obj = Foo()
运行此命令时,我得到:
from foo import Foo
ImportError: cannot import name Foo
您必须这样做:
modules/foo/__init__.py # instead of foo.py
modules/foo/bar.py
modules/foo/baz.py
Perl的布局不起作用。如果模块有子代,则根与子代并存。
值得一提的是,一些Python开发人员强烈认为您应该__init__.py
留空(或至少最少),因为它在您导入任何子级时都首先导入。
如果__init__.py
对您不起作用,您可能还会遇到其他一些问题,特别是如果您确实有一个modules/
目录,但是如果没有更多详细信息,我将无法诊断:)
啊哈 不要惹恼sys.path
; 这总是表明您正在为自己的生活变得更加艰难。(您是否必须为sys.path
导入其他人的代码而烦恼?然后,当正确的代码在那里时,为什么还要自己做呢?)
只需将它们直接放在源树的根目录中即可project.git/foo/bar.py
。只要从根目录运行测试工具(或其他工具),就可以毫无问题地导入它们。
您可能还想尝试像pytest这样的测试库,它可以为您提供发现和各种奇特的东西。
另请参阅:Python项目的文件系统结构
或者是我的一个较小的项目,以获得更实际的示例:https : //github.com/eevee/dywypi
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句