说,我的文件系统上有这个结构: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他造成了错误。
答案 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
中设置它进入那些从下一个目录下来。但是,在执行此操作时要小心,不要用不必要或相互矛盾的事情填充模块名称空间。