对相关python进口的极限答案
我知道 Python中有相同的导入问题有很多问题,但似乎没人设法提供正确使用的明确示例. 假设我们有一个包含两个模块foo和bar的软件包.里面的foo我们需要能够访问吧. 因为我们还在开发它,所以mypackage不在sys.path中. 我们希望能够: > import mypackage.foo 为了确保在所有这些情况下都能正常工作,我们必须在foo.py中进行导入. # mypackage/__init__.py ... # mypackage/foo/__init__.py ... # mypackage/bar.py def doBar() print("doBar") # mypackage/foo/foo.py import bar # fails with module not found import .bar #fails due to ValueError: Attempted relative import in non-package def doFoo(): print(doBar()) if __name__ == '__main__': doFoo() 解决方法看看 PEP 328的以下信息:
当您将foo.py作为脚本运行时,该模块的__name__是“__main__”,因此您不能进行相对导入.即使mypackage在sys.path上也是如此.基本上,如果导入了该模块,则只能从模块进行相对导入. 以下是解决这个问题的几个选择: 1)在foo.py中,检查是否__name__ ==’__main__’,并有条件地将mypackage添加到sys.path中: 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: from .. import bar 2)始终使用mypackage导入栏导入栏,并执行foo.py,使得mypackage可以自动显示: $cd <path containing mypackage> $python -m mypackage.foo.foo (编辑:甘南站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |