当前位置: 首页 > 面试题库 >

了解Python中的导入链

公良鸿光
2023-03-14
问题内容

我知道有几个类似的问题,但是我很难理解我在获取和浏览文档时遇到的错误,而类似的问题还没有帮助。如果有的话,类似的问题会让我觉得自己在做的事是对的。

我有以下文件:

src / main.py

from pack import pack

if __name__ == '__main__':
    pack.exec("Hello Universe!")

src / pack / pack.py

import util

def exec(text):
    util.write(text)

if __name__ == '__main__':
    exec("Hello World!")

src / pack / util.py

def write(text):
    print(text)
  • src / pack / _ init _.py *

    EMPTY FILE

当我python pack.pysrc/pack目录运行时,它可以工作(打印“ Hello World!”)。但是,当我python main.pysrc目录运行时,出现以下异常:

Traceback (most recent call last):
  File ".../src/main.py", line 1, in <module>
    from pack import pack
  File ".../src/pack/pack.py", line 1, in <module>
    import util
ImportError: No module named util

如果我改变了进口线pack.py,以from . import util作为建议,有效相反occours。
main.py运行成功,但是现在pack.py失败,引发:

Traceback (most recent call last):
  File ".../src/pack/pack.py", line 1, 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目录)现在都可以导入。因此from pack import pack。但是,util.py现在您需要访问from pack import util。正如您所注意到的,您也可以from . import util从内部执行操作pack.py

但是,您不能同时真正做到两者。要么src/是主目录,要么src/pack是。

一个明显但错误的解决方案是让main.py将src/pack目录添加到PYTHONPATH中。那会起作用,但这不是一个好主意。正确的方法是下定决心。是src/pack应该通过导入模块,import pack还是仅仅是带有一堆Python脚本的文件夹?决定!:-)

我认为在这种情况下,显然src/pack应该将其作为模块。因此,请像对待模块一样对待它,并确保它像模块一样可用。这样您from pack import util甚至可以在pack.py作为主脚本运行时使用。

你是怎样做的?好吧,基本上,您可以将pack模块安装在站点程序包中,或者将src目录添加到PYTHONPATH中。最后一个就是您在开发过程中想要的。您可以使用手动进行export PYTHONPATH=<path>,也可以让测试运行人员为您完成。您没有测试运行程序?好吧,你应该,但这是另一个问题。:)

要在不再进行开发后永久安装它,请查看Distribute。它包括一个测试运行程序。;)



 类似资料:
  • 本文向大家介绍快速了解Python相对导入,包括了快速了解Python相对导入的使用技巧和注意事项,需要的朋友参考一下 1、绝对导入和相对导入 绝对导入:按照sys.path顺序搜索,先主目录(sys.path中第一项''),然后PYTHONPATH环境变量、标准库路径、pth指定路径等。 相对导入:在模块所在同一个包内搜索,注意该包目录与主目录的区别。 例1:有以下目录 mod.py内容:imp

  • 本文向大家介绍深入了解Python在HDA中的应用,包括了深入了解Python在HDA中的应用的使用技巧和注意事项,需要的朋友参考一下 Event Handler 在HDA中,要创建Python脚本,需要先选择一个事件处理器(EventHandle),他表示你要在什么时候执行你现在所创建的脚本命令 On Created (在节点创建时,执行脚本) 如选择此项编辑Python脚本,Python将会在

  • 这是一个非常基本的问题,有一个非常广泛的答案,由@Mark Roddy编写使用导入模块或从模块导入? 根据这个答案,每种方法都有利弊,但结果是相同的,两者都有效。 这样做: 或 应该有用。 我的问题: 考虑这个例子: 其中: 以及: 它给出了以下输出: 所以我很困惑。两者都应该起作用。为什么Python会为第一种方法生成异常?

  • 问题内容: 我遇到了一个我无法解释的奇怪问题。我希望有人可以帮助您! 我正在运行Python 2.7.3和Scipy v0.14.0,并试图实现一些非常简单的多处理器算法,以使用该模块加速我的代码。我设法使一个基本的示例工作: 运行正常,返回 但是,如果我取消注释该行,则会得到: 而且我可以看到只有一个核心在我的系统上进行工作。实际上,从scipy包导入任何模块似乎都具有这种效果(我已经尝试了几次

  • 问题内容: 大家好-我正在用Python中的相关知识来表达自己的观点。我已经阅读了30篇文档,并在SO和其他论坛上阅读了很多帖子-似乎还是行不通。 我的目录结构目前看起来像这样 我希望expander.py和language_id.py可以访问功能模块。我运行python main.py,可以从components.expander import 和components.language_id i

  • 问题内容: 我目前正在阅读Python,目前正在研究生成器。我发现很难回头。 从Java的背景出发,是否有Java的等效语言?这本书讲的是“生产者/消费者”,但是当我听说线程的时候。 什么是发电机,为什么要使用它?显然,无需引用任何书籍(除非您可以直接从书籍中找到一个体面,简单的答案)。也许举一些例子,如果您感到慷慨! 问题答案: 注意:本文采用Python 3.x语法。† 一个发电机仅仅是它返回