理解Python中的一系列进口
我知道有几个类似的问题,但我很难理解我得到的错误,浏览文档和类似的问题还没有帮助.如果有的话,类似的问题让我觉得我正在做的是对的.
我有以下文件: SRC / main.py from pack import pack if __name__ == '__main__': pack.exec("Hello Universe!") SRC /包/ pack.py import util def exec(text): util.write(text) if __name__ == '__main__': exec("Hello World!") SRC /包/ util.py def write(text): print(text) * SRC /包/ _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",in <module> import util ImportError: No module named util 如果我将pack.py中的导入行更改为.按照建议导入util,实际上是相反的问题. main.py成功运行,但现在pack.py失败,提升: Traceback (most recent call last): File ".../src/pack/pack.py",in <module> from . import util ValueError: Attempted relative import in non-package 我原以为导入是相对于当前位置的,因此你应该能够构建这样的导入链.对我来说,模块应该根据程序的起始位置以不同方式导入兄弟文件,这似乎很奇怪. 有人可以解释为什么这种错误以一种方式而不是另一种方式发生,并且如果有某种方式允许这种文件结构运行我是否想从main.py或pack.py运行? 解决方法
在这两种情况下,您都无法进行导入工作.这是因为在一种情况下,您运行pack.py作为主文件,而在另一种情况下,您将其作为包的一部分运行.
当您将其作为独立脚本python pack.py运行时,“pack”目录将添加到PYTHONPATH,这意味着您可以导入其中的任何模块.因此,import util将起作用. 运行python main.py时,将src目录添加到PYTHONPATH.这意味着src中的任何模块或包(例如pack目录)现在都可以导入.因此从包导入包.但是,要访问util.py,您现在需要从pack import util执行.你也可以做.正如您所注意到的,从pack.py中导入util. 但你不可能同时做到这两点. src /是主目录还是src / pack. 显而易见但错误的解决方案是让main.py将src / pack目录添加到PYTHONPATH.这将有效,但这不是一个好主意.这样做的正确方法是下定决心. src / pack是一个应该通过import pack导入的模块,还是只是一个包含一堆Python脚本的文件夹?决定! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |