我是Python的新手,我知道这个问题被多次询问,但不幸的是,我的情况似乎有点不同......我创建了一个包(或者我认为).目录树是这样的:
mydir
lib (__init__.py)
mod1 (__init__.py, mod11.py)
Run Code Online (Sandbox Code Playgroud)
在括号中,目录中有文件.两个__init__.py文件都是零长度.该文件mydir/lib/mod1/mod11.py包含以下内容:
def mod12():
print "mod12"
Run Code Online (Sandbox Code Playgroud)
现在,我跑python,然后import lib,哪个工作正常,然后lib.mod11()或lib.mod12().最后两个中的任何一个都给出了主题错误消息.实际上dir(lib)在步骤2之后没有显示mod11或者mod12任何一个.我似乎错过了一些非常简单的事情.(我在Ubuntu 10.10中使用Python 2.6)
谢谢
Nou*_*him 32
当你import lib,你正在导入包.在这种情况下,唯一要评估和运行的文件是__init__.pylib目录中的0字节.
如果你想访问你的函数,你可以做这样的事情from lib.mod1 import mod1然后mod12像这样运行函数mod1.mod12().
如果您希望能够访问mod1当您导入lib,你需要把import mod1里面__init__.py的内部文件lib目录.
Kei*_*ith 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
Run Code Online (Sandbox Code Playgroud)
另一种方法是使用from语法将包中的模块"拉"到脚本命名空间中.
>>> from lib.pkg1 import mod11
Run Code Online (Sandbox Code Playgroud)
然后简单地引用该函数mod11.mod12().
我这样做的方法是将__ init__.py文件留空,并执行:
import lib.mod1.mod11
lib.mod1.mod11.mod12()
Run Code Online (Sandbox Code Playgroud)
要么
from lib.mod1.mod11 import mod12
mod12()
Run Code Online (Sandbox Code Playgroud)
您可能会发现mod1目录是不必要的,只需在lib中使用mod12.py即可.
| 归档时间: |
|
| 查看次数: |
106639 次 |
| 最近记录: |