【问题标题】:SystemError: Parent module '' not loaded, cannot perform relative import [duplicate]SystemError:父模块''未加载,无法执行相对导入[重复]
【发布时间】:2016-02-23 14:12:45
【问题描述】:

我有以下目录:

myProgram
└── app
    ├── __init__.py
    ├── main.py 
    └── mymodule.py

mymodule.py:

class myclass(object):

def __init__(self):
    pass

def myfunc(self):
    print("Hello!")

main.py:

from .mymodule import myclass

print("Test")
testclass = myclass()
testclass.myfunc()

但是当我运行它时,我得到了这个错误:

Traceback (most recent call last):
  File "D:/Users/Myname/Documents/PycharmProjects/myProgram/app/main.py", line 1, in <module>
    from .mymodule import myclass
SystemError: Parent module '' not loaded, cannot perform relative import

这行得通:

from mymodule import myclass

但是当我输入这个时我没有自动完成并且有一条消息:“未解析的引用:mymodule”和“未解析的引用:myclass”。 在我正在处理的另一个项目中,我收到错误消息:“ImportError: No module named 'mymodule'.

我能做什么?

【问题讨论】:

  • 我遇到了同样的问题。显然在包中运行脚本被认为是一种不好的做法,在这种情况下你不能使用相对导入。由于您的 main.py 在包应用程序中,因此使用相对导入会导致错误。仅在模块中使用相对导入并在包外运行脚本。
  • 使用python -m package.module 而不是python package/module.py
  • This 是解决问题的答案。
  • 当我不小心运行了我正在编辑的当前文件而不是我的 main.py 启动器时,在 PyCharm 中得到了这个。

标签: python python-3.x


【解决方案1】:

我遇到了同样的问题,我通过使用绝对导入而不是相对导入来解决它。

例如,在你的情况下,你可以这样写:

from app.mymodule import myclass

你可以在documentation看到。

请注意,相对导入是基于当前的名称 模块。由于主模块的名称总是“__main__”, 用作 Python 应用程序主模块的模块 必须始终使用绝对导入。

编辑:如果您遇到此错误ImportError: No module named 'app.app'; 'app' is not a package,请记住将__init__.py 文件添加到您的app 目录中,以便解释器可以将其视为一个包。文件为空就好了。

【讨论】:

【解决方案2】:

我通常使用这种解决方法:

try:
    from .mymodule import myclass
except Exception: #ImportError
    from mymodule import myclass

这意味着您的 IDE 应该选择正确的代码位置,python 解释器将设法运行您的代码。

【讨论】:

  • except Exception 捕获 any 异常,这不是您想要的。
  • 但是我要SystemError还是ImportError
  • 你想要ImportError
  • 我只是想概述一下 OP,令人困惑的是,有一个 SystemError
  • 如果你想同时抓住两个,抓住两个(except SystemError, ImportError);不要捕获所有错误。
【解决方案3】:

如果您只是在app 下运行main.py,只需像这样导入

from mymodule import myclass

如果您想在其他文件夹上调用main.py,请使用:

from .mymodule import myclass

例如:

├── app
│   ├── __init__.py
│   ├── main.py
│   ├── mymodule.py
├── __init__.py
└── run.py

ma​​in.py

from .mymodule import myclass

run.py

from app import main
print(main.myclass)

所以我认为你的主要问题是如何打电话给app.main

【讨论】:

  • 是的,这就是问题所在。我们该怎么做?
  • 我认为第一部分与您答案的第二部分相反。
【解决方案4】:

如果您在 bash shell 的命令行中运行脚本时再上一层,问题将得到解决。为此,请使用cd .. 命令更改脚本将在其中运行的工作目录。结果应如下所示:

[username@localhost myProgram]$

而不是这样:

[username@localhost app]$

一旦你在那里,而不是按以下格式运行脚本:

python3 mymodule.py

改成这样:

python3 app/mymodule.py

根据树形图的结构,此过程可以再次重复上一级。还请包括为您提供上述错误消息的编译命令行。

【讨论】:

    猜你喜欢
    • 2015-08-01
    • 1970-01-01
    • 2018-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-05
    • 2015-09-15
    相关资源
    最近更新 更多