【问题标题】:Python Relative import does not work from command line gives ValueErrorPython相对导入在命令行中不起作用给出ValueError
【发布时间】:2013-04-13 09:48:42
【问题描述】:

我的目录结构如下

microblog/__init__.py
         urls.py
         views.py
         wsgi.py
         settings/__init__.py
                 testing.py
                 base.py
                 local.py

在 testing.py 我有一个相对导入

from .base import *
...
...more code

当我尝试从 microblog/settings 目录中的命令行运行 testing.py 时,使用 python testing.py

from .base import *
ValueError: Attempted relative import in non-package

为什么这不起作用。设置目录是带有 init.py 的有效包。仅当我更改

from .base import *

from base import *

当我从命令行运行带有相对导入的“testing.py”包时,我试图了解为什么相对本地导入失败并给出 ValueError。

【问题讨论】:

  • 我认为这个问题已经得到解答..我刚刚看到stackoverflow.com/questions/9123062/…。正如 icyrocks 回答所说,当我运行 python testing.py 时。然后它会自动认为包是“主要的”。要从命令行运行具有真实导入的包,我需要执行“python -m microblog.settings.testing”
  • “为什么这不起作用。”错误信息告诉你原因!您正在从 testing 导入的脚本不是包。
  • 好吧,它说测试是一个非包,对我来说没有意义,因为我认为测试是包设置的一部分..但正如你所说,我没有意识到“测试”实际上是在独立运行时的“main”包。 icyrock 的回答为我澄清了这一点。关于 stackoverflow 的许多其他问题解决了相对导入的不同方面,这在我的案例中并不适用,因为我确实在一个带有 bonafide dunder init.py 的包中进行了测试。
  • 即使作为包的一部分导入,testing 也不是包,它是settings

标签: python


【解决方案1】:

来自 icyrock 在this post 中的回答准确地阐明了我对 python“repl”的不理解。

在我运行时的目录微博/设置中

python testing.py

它实际上将测试放在包“main”中,它不知道测试是包“设置”的一部分。而是使用 this 将“testing.py”作为模块作为其正常包层次结构的一部分运行

python -m microblog.settings.testing 

在没有任何 ValueError 的情况下运行它,因为现在 python 知道“测试”是包“设置”的一部分,其中相对本地导入“来自 .base 导入 *”非常有意义。

【讨论】:

    猜你喜欢
    • 2018-01-04
    • 2018-01-08
    • 1970-01-01
    • 2014-10-31
    • 2018-07-10
    • 2017-04-25
    • 2022-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多