1

说,我的文件系统上有这个结构:f/o/o/bar.py. 我怎样才能bar.py轻松访问内容?据我所知,我不能简单地使用:

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

在这种情况下会在's中import f寻找 vars 。f__init__.py

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

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

那么,有没有更简单的方法来处理包,如下所示:

import sys
print(sys.argv)

虽然 'argv' 没有被显式导入,但我们可以访问它。

PS 似乎问题出在 Python 本身:@ 2.7.5 一切正常,但@ 3.2.5, 3.3.2 他导致了错误。

4

2 回答 2

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,您应该将import上面的每个语句替换为“from .import”(这也适用于 python 2.7)。例如:

# f/__init__.py:
from . import o
于 2013-09-19T17:24:26.560 回答
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得到所有的子模块),你可以__init__.py通过将 import 语句放入下一个目录中的那些来设置它。但是,这样做时要小心,不要用不必要或矛盾的东西填充模块名称空间。

于 2013-09-19T17:25:31.143 回答