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
main.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:父模块''未加载,无法执行相对导入[重复]的主要内容,如果未能解决你的问题,请参考以下文章