查看来自PEP 328的以下信息:@H_404_1@
相对导入使用模块的__name__属性来确定该模块在包层次结构中的位置。如果模块的名称不包含任何程序包信息(例如,将其设置为’‘),则相对导入的解析就好像该模块是顶级模块一样,无论该模块实际位于文件系统上的哪个位置。@H_404_1@
当您foo.py以脚本运行时,该模块的__name__是’‘,因此您无法进行相对导入。即使mypackage开启了,这也是正确的sys.path。基本上,您只能从模块导入相对导入。@H_404_1@
1)在中foo.py,检查是否__name__ == ‘‘有条件地添加mypackage到sys.path:@H_404_1@
if __name__ == '__main__':
import os, sys
# get an absolute path to the directory that contains mypackage
foo_dir = os.path.dirname(os.path.join(os.getcwd(), __file__))
sys.path.append(os.path.normpath(os.path.join(foo_dir, '..', '..')))
from mypackage import bar
else:
2)始终bar使用导入from mypackage import bar,并foo.py以一种mypackage自动可见的方式执行:@H_404_1@
$ cd <path containing mypackage>
$ python -m mypackage.foo.foo@H_404_1@