【问题标题】:Struggling with python's import mechanism与 python 的导入机制作斗争
【发布时间】:2022-12-01 01:05:57
【问题描述】:

我是一位经验丰富的 Java 企业开发人员,但对 Python 企业开发商店还很陌生。我目前正在努力理解为什么有些导入有效而其他导入无效。

一些背景:我们的开发团队最近将 python 从 3.6 升级到 3.10.5,以下是我们的包结构

src/
bunch of files (dockerfile, Pipfile, requrirements.txt, shell scripts, etc)
  package/
      __init__.py
      moduleA.py
      subpackage1/
          __init__.py
          moduleX.py
          moduleY.py
      subpackage2/
          __init__.py
          moduleZ.py
      tests/
          __init__.py
          test1.py
    

现在,在 module.by 中,我试图像这样导入子包 2/moduleS.py

from .subpackage2 import moduleZ

但是,我收到错误提示

ImportError: attempted relative import with no known parent package

有趣的是,如果我将 moduleA.py 移出 package/ 并移至 src/ 中,那么它就能找到所有内容。我不确定为什么会这样。

我通过执行 python package/moduleS.py 来运行 moduleA.py。

现在,我读到可能存在问题,因为如果将模块作为脚本运行(或那些行中的某些内容),您需要提供 -m 参数。但是,如果我这样做,我会收到以下错误:

ModuleNotFoundError: No module names 'package1/moduleA.py'

我什至尝试运行 package1/moduleA 并删除 .py,但这也不起作用。我能理解为什么我在技术上从未安装过它?

所有这一切都发生了,因为显然,测试失败了,为了让它工作,他们添加了相关的导入。他们将导入从“from subpackage2 import moduleZ”更改为“from .subpackage2 import moduleZ”,测试开始工作,但应用程序开始失败。

我能得到的任何理解将不胜感激。

【问题讨论】:

  • 你安装包了吗?
  • 您将您的目录结构描述为包含package,但您的使用都是使用package1。请修复它,使两者一致(我假设它们在本地是一致的,而你只是在这里打错了其中一个)。
  • @juanpa.arrivillaga:他们已经说过他们还没有安装它:“我能理解为什么我在技术上从未安装过它?”它仍然可以工作,如果sys.path包含src目录(例如因为它是工作目录)并且他们使用-m正确启动脚本的模块。
  • 您是从该目录运行还是正在安装软件包?有没有说明如何打包安装的setup.py?

标签: python python-3.x python-import importerror


【解决方案1】:

-m 参数与进口名称,而不是路径。所以你会使用python3 -m package1.moduleA(使用.而不是/,并且没有.py),而不是python3 -m package1/moduleA.py

也就是说,它仅在 package1.moduleA 位于 sys.path 中的根之一时才有效。害羞地安装包,让它工作的最简单方法是确保你的工作目录是src(所以package1存在于工作目录中):

$ cd path/to/src
$ python3 -m package1.moduleA

显然,这是脆弱的;理想情况下,您将其设为可安装包,安装它(在全局site-packages,用户site-packages,或在使用内置venv模块或第三方virtualenv模块创建的虚拟环境中),然后您的工作目录不再重要(因为 site-packages 将自动成为您的 sys.path 的一部分),但对于简单测试,只要工作目录正确(不确定它对您来说是什么),并且您使用 @ 987654338@ 正确(您使用不正确),相对导入将起作用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-02
    • 2019-02-17
    • 2022-01-08
    相关资源
    最近更新 更多