我习惯了一种脚本语言,在这种语言中布局模块非常常见:
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)
你想要创建的是包.
在文件夹中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)
还有很多其他的东西!
| 归档时间: |
|
| 查看次数: |
1476 次 |
| 最近记录: |