我是Python的新手,我知道这个问题被多次询问,但不幸的是,我的情况似乎有点不同...... 我创建了一个包(或者我认为)。目录树是这样的:
mydir
lib (__init__.py)
mod1 (__init__.py, mod11.py)
在括号中,目录中有文件。两个__init__.py
文件都是零长度。
文件mydir/lib/mod1/mod11.py
包含以下内容:
def mod12():
print "mod12"
现在,我运行python
,然后运行import lib
,其运行正常,然后lib.mod11()
或lib.mod12()
。
最后两个中的任何一个都给出了主题错误消息。实际上,在第2步之后,dir(lib)
也不会显示mod11
或mod12
。
我似乎错过了一些非常简单的事情。
(我在Ubuntu 10.10中使用Python 2.6)
谢谢
答案 0 :(得分:31)
当您import lib
时,您正在导入该包。在这种情况下,唯一要评估和运行的文件是lib目录中的0字节__init__.py
。
如果您想要访问自己的功能,可以执行类似from lib.mod1 import mod1
之类的操作,然后像mod12
一样运行mod1.mod12()
功能。
如果您希望在导入mod1
时能够访问lib
,则需要在import mod1
文件内放置__init__.py
lib
目录。
答案 1 :(得分:23)
更准确地说,您的mod1
和lib
目录不是模块,而是包。文件mod11.py
是一个模块。
Python不会自动导入子包或模块。您必须明确地执行此操作,或通过在初始化程序中添加import语句来“欺骗”。
>>> import lib
>>> dir(lib)
['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__']
>>> import lib.pkg1
>>> import lib.pkg1.mod11
>>> lib.pkg1.mod11.mod12()
mod12
另一种方法是使用from
语法将包中的模块“拉”到脚本命名空间中。
>>> from lib.pkg1 import mod11
然后将该函数简称为mod11.mod12()
。
答案 2 :(得分:5)
我这样做的方法是将__ init__.py文件留空,并执行:
import lib.mod1.mod11
lib.mod1.mod11.mod12()
或
from lib.mod1.mod11 import mod12
mod12()
您可能会发现mod1目录是不必要的,只需在lib中使用mod12.py。
答案 3 :(得分:4)
我的解决方案是将这些导入放在lib的__init__.py
中:
in file: __init__.py
import mod1
然后,
import lib
lib.mod1
会正常工作。