对相关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 (编辑:岳阳站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- python – 运行迁移时出错:sqlalchemy.exc.CompileError:
- 【Python】python文件打开方式详解——a、a+、r+、w+区别
- 将Python虚拟环境与终结器配合使用
- python – 更优雅地处理未定义的参数
- 【Python】Python-numpy逻辑报错:The truth value of an a
- Python记录多个模块记录器不在主程序外工作
- Python / Scipy – 将optimize.curve_fit的sigma实现到opti
- 如何使用Anaconda将IPython4降级为3
- django – 带有简单缩略图的衬垫
- 《父与子的编程之旅》——可计数与不可计数的循环