【发布时间】:2011-03-08 00:11:10
【问题描述】:
我知道有几个类似的问题,但我很难理解我遇到的错误,浏览文档和类似的问题还没有帮助。如果有的话,类似的问题让我觉得我所做的是正确的。
我有以下文件:
src/main.py
from pack import pack
if __name__ == '__main__':
pack.exec("Hello Universe!")
src/pack/pack.py
import util
def exec(text):
util.write(text)
if __name__ == '__main__':
exec("Hello World!")
src/pack/util.py
def write(text):
print(text)
*src/pack/_init_.py*
EMPTY FILE
当我从src/pack 目录运行python pack.py 时,它可以工作(打印“Hello World!”)。但是,当我从 src 目录运行 python main.py 时,我得到以下异常:
Traceback (most recent call last):
File ".../src/main.py", line 1, in <module>
from pack import pack
File ".../src/pack/pack.py", line 1, in <module>
import util
ImportError: No module named util
如果我按照建议将pack.py 中的导入行更改为from . import util,实际上会发生相反的情况。 main.py 运行成功,但现在 pack.py 失败,引发:
Traceback (most recent call last):
File ".../src/pack/pack.py", line 1, in <module>
from . import util
ValueError: Attempted relative import in non-package
我会认为导入是相对于当前位置的,因此您应该能够构建这样的导入链。在我看来,模块应该根据程序的启动位置以不同的方式导入同级文件。
有人可以解释为什么这个错误以一种方式发生而不是另一种,如果有某种方法可以让这个文件结构运行,无论我是想从main.py还是pack.py运行?
【问题讨论】:
标签: python import python-3.x