子模型名称与文件相同的Python模块布局

Mar*_*e07 1 python packages

我习惯了一种脚本语言,在这种语言中布局模块非常常见:

lib/Foo.pm
lib/Foo/Bar.pm
lib/Foo/Baz.pm
Run Code Online (Sandbox Code Playgroud)

如果你有Foo.pm,那么有一个名为Foo的目录,你可以在其下放置子模块.

在Python中,我试图像这样模仿布局:

modules/foo.py
modules/foo/bar.py
modules/foo/baz.py
Run Code Online (Sandbox Code Playgroud)

但是,这不起作用,因为我这样做:

from foo import Foo
Run Code Online (Sandbox Code Playgroud)

Python认为我正在导入一个名为'foo'而不是foo.py的目录.我试图弄乱init .py业务无济于事.

有办法解决这个问题吗?我发现Python无法区分目录foo和文件foo.py是非常烦人的.

编辑:我想我错过了一件重要的作品.我通过单元测试来获取模块/目录,因此整个目录结构如下所示:

modules/foo.py
modules/foo/bar.py
modules/foo/baz.py
tests/unit.py
Run Code Online (Sandbox Code Playgroud)

在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()
Run Code Online (Sandbox Code Playgroud)

当我运行这个时,我得到:

from foo import Foo
ImportError: cannot import name Foo
Run Code Online (Sandbox Code Playgroud)

use*_*623 5

你想要创建的是包.

在文件夹中foo放入一个带有名称的空白文件__init__.py.然后Python会将foo视为一个包.如果modules也被视为一个包,也在其中放置一个空白__init__.py.

所以从你的问题来看,如果包正确完成并且你有这个结构:

modules/__init__.py
modules/foo/__init__.py
modules/foo/bar.py
modules/foo/baz.py
Run Code Online (Sandbox Code Playgroud)

你可以这样做:

import module
from module import foo
from module.foo import bar
import module.foo.bar as foobar
Run Code Online (Sandbox Code Playgroud)

还有很多其他的东西!