SystemError: родительский модуль '' не загружен, не может выполнять относительный импорт
У меня есть следующий каталог:
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: нет модуля с именем" mymodule "
Что я могу сделать?
Ответы
Ответ 1
У меня была та же проблема, и я решил ее использовать абсолютный импорт вместо относительного.
например, в вашем случае, вы напишете что-то вроде этого:
from app.mymodule import myclass
Вы можете видеть в документации.
Обратите внимание, что относительный импорт основан на имени текущего модуль. Поскольку имя основного модуля всегда "__main__
", модули, предназначенные для использования в качестве основного модуля приложения Python должен всегда использовать абсолютный импорт.
Ответ 2
если вы просто запустите main.py
под app
, просто импортируйте, например
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
.
Ответ 3
Обычно я использую это обходное решение:
try:
from .mymodule import myclass
except Exception: #ImportError
from mymodule import myclass
Это означает, что ваша IDE должна забрать правильное местоположение кода, а интерпретатору python удастся запустить ваш код.
Ответ 4
Если вы перейдете на один уровень вверх при запуске script в командной строке оболочки bash, проблема будет решена. Для этого используйте команду cd ..
, чтобы изменить рабочий каталог, в котором будет работать ваш script. Результат должен выглядеть следующим образом:
[[email protected] myProgram]$
вместо этого:
[[email protected] app]$
Как только вы там, вместо запуска script в следующем формате:
python3 mymodule.py
Измените его так:
python3 app/mymodule.py
Этот процесс можно повторить еще раз на один уровень вверх в зависимости от структуры вашей диаграммы дерева. Также укажите командную строку компиляции, которая дает вам указанное сообщение об ошибке.