SystemError:父模块''未加载,无法执行相对导入[重复]

Posted

技术标签:

【中文标题】SystemError:父模块\'\'未加载,无法执行相对导入[重复]【英文标题】: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'.

我能做什么?

【问题讨论】:

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

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

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

from app.mymodule import myclass

你可以在documentation看到。

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

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

【讨论】:

如果这样做我会得到另一个错误,ImportError: No module named 'app.app'; 'app' is not a package:gist.github.com/anonymous/ac0b7b3c36b0a60be6273394d1ddbdfb @fiatjaf 请问你能和我们分享你的代码结构吗? 谢谢你,@Erman。刚刚在gist的评论中做到了。 你声明你的 init.py 文件了吗?请在里面声明你所有的包裹。 有关 init.py 文件的更多信息,请查看此链接。 docs.python.org/3/tutorial/modules.html#packages【参考方案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

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

【讨论】:

以上是关于SystemError:父模块''未加载,无法执行相对导入[重复]的主要内容,如果未能解决你的问题,请参考以下文章

pip install: 无法打开文件 pip,或父模块''未加载

尝试执行编译任务但无法加载神秘模块

angular ngbuild prod 未加载任何模块

错误:无法加载 celery 应用程序。未找到模块任务

isparta 模块未正确加载,因此无法运行测试用例

Apache 无法启动 - 表示 httpd 模块已加载但未运行