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

phe*_*ez1 93 python python-3.x

我有以下目录:

myProgram
??? app
    ??? __init__.py
    ??? main.py 
    ??? mymodule.py
Run Code Online (Sandbox Code Playgroud)

mymodule.py:

class myclass(object):

def __init__(self):
    pass

def myfunc(self):
    print("Hello!")
Run Code Online (Sandbox Code Playgroud)

main.py:

from .mymodule import myclass

print("Test")
testclass = myclass()
testclass.myfunc()
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

这有效:

from mymodule import myclass
Run Code Online (Sandbox Code Playgroud)

但是当我输入时,我没有自动完成,并且有一条消息:"未解析的引用:mymodule"和"未解析的引用:myclass".在我正在处理的其他项目中,我收到错误:"ImportError:没有名为'mymodule'的模块.

我能做什么?

Erm*_*man 51

我有同样的问题,我通过使用绝对导入而不是相对导入来解决它.

例如在你的情况下,你会写这样的东西:

from app.mymodule import myclass
Run Code Online (Sandbox Code Playgroud)

您可以在文档中看到.

请注意,相对导入基于当前模块的名称.由于主模块的名称始终为" __main__",因此用作Python应用程序主模块的模块必须始终使用绝对导入.

  • 如果这样做,我会收到另一个错误,即“导入错误:没有名为“ app.app”的模块;'app'不是软件包`:https://gist.github.com/anonymous/ac0b7b3c36b0a60be6273394d1ddbdfb (2认同)

小智 18

我通常使用此解决方法:

try:
    from .mymodule import myclass
except Exception: #ImportError
    from mymodule import myclass
Run Code Online (Sandbox Code Playgroud)

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

  • 如果你想捕获两者,请同时捕获(`除了SystemError,ImportError`); 不要抓住所有错误. (9认同)
  • 你想要`ImportError` (8认同)
  • `除了Exception`捕获*any*异常,这不是你想要的. (6认同)

mym*_*ise 8

如果你只是运行main.pyapp,只需导入就好

from mymodule import myclass
Run Code Online (Sandbox Code Playgroud)

如果要调用main.py其他文件夹,请使用:

from .mymodule import myclass
Run Code Online (Sandbox Code Playgroud)

例如:

??? app
?   ??? __init__.py
?   ??? main.py
?   ??? mymodule.py
??? __init__.py
??? run.py
Run Code Online (Sandbox Code Playgroud)

main.py

from .mymodule import myclass
Run Code Online (Sandbox Code Playgroud)

run.py

from app import main
print(main.myclass)
Run Code Online (Sandbox Code Playgroud)

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

  • 是的,这是个问题.我们该怎么做呢? (2认同)