加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

理解Python中的一系列进口

发布时间:2020-12-20 12:17:50 所属栏目:Python 来源:网络整理
导读:我知道有几个类似的问题,但我很难理解我得到的错误,浏览文档和类似的问题还没有帮助.如果有的话,类似的问题让我觉得我正在做的是对的. 我有以下文件: SRC / main.py from pack import packif __name__ == '__main__': pack.exec("Hello Universe!") SRC /包
我知道有几个类似的问题,但我很难理解我得到的错误,浏览文档和类似的问题还没有帮助.如果有的话,类似的问题让我觉得我正在做的是对的.

我有以下文件:

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脚本的文件夹?决定!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读