访问包内的模块/对象,无需显式导入

时间:2013-09-19 17:08:56

标签: python

说,我的文件系统上有这个结构:f/o/o/bar.py。如何访问bar.py内容不错&简单? 据我所知,我不能简单地使用:

import f #Presumably sets initial point from where to search.
print(f.o.o.bar.object)

在这种情况下,import f会在f的{​​{1}}内寻找变种。

当我使用下面的代码时,它可以工作,但似乎我必须为每个模块使用这样的导入:

__init__.py

那么,是否有更容易和更简单的方法来处理包,如下所示:

import f.o.o.bar
print(f.o.o.bar.object)

虽然'argv'尚未明确导入,但我们可以访问它。

P.S。似乎问题出在Python本身:@ 2.7.5一切正常,但是@ 3.2.5,3.3.2他造成了错误。

2 个答案:

答案 0 :(得分:3)

如果您希望自动导入它们,则需要在__init__.py文件中指定:

# f/__init__.py:
import o

# f/o/__init__.py:
import o

# f/o/o/__init__.py:
import bar

# f/o/o/bar.py:
object = 3

然后:

>>> import f
>>> f.o.o.bar.object
3

[编辑]:上面的代码适用于python 2.x.由于你想使用python 3.x,你应该用“from.import”替换上面的每个import语句(这也适用于python 2.7)。例如:

# f/__init__.py:
from . import o

答案 1 :(得分:2)

您可以使用from module import baz声明。

from f.o.o.bar import baz
print baz

确保每个子目录中都有一个__init__.py文件,将这些目录标记为Python应该查看的包。这是我的测试目录:

C:\test\
    f\
        __init__.py # empty
        o\
            __init__.py # empty
            o\
                __init__.py # empty
                bar.py # contains the line: baz = 3

然后在命令窗口中:

C:\test>python
Python 2.7.4 (default, Apr  6 2013, 19:54:46) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from f.o.o.bar import baz
>>> baz
3

请注意,我正在使用C:\test作为工作目录运行解释器。 Python在当前目录中查找模块和包(在这种情况下,我们希望它找到名为f的包)。如果您从其他地方访问软件包/模块,请说C:\somewhere\else,您需要确保C:\test上显示PYTHONPATH(包含该软件包的目录)。


如果您想自动导入内容(因此您只需import f并获取所有子模块),您可以通过放置import语句在每个__init__.py中设置它进入那些从下一个目录下来。但是,在执行此操作时要小心,不要用不必要或相互矛盾的事情填充模块名称空间。