Как исправить ошибку импорта при импорте модуля python из разных каталогов - PullRequest
0 голосов
/ 23 января 2019

У меня есть несколько каталогов в моем проекте Python.

|--main.py
|--sideproject/
|           |--sub_main.py
|           |--test.py
|           |--__init__.py

sub_main требуется в main, но при импорте sub_main test.py

возникает ошибка, следующий код работает при запускеsub_main, но когда main.py импортирует sub_main, функция обрывается: «ModuleNotFoundError: нет модуля с именем« test »

from test import *

При изменении его на from .test import * main.py работает, но sub_main не будет.

Я попытался добавить пробел __init__.py, как некоторые упоминали, но, похоже, ничего не работает.

1 Ответ

0 голосов
/ 24 января 2019

Вот (не очень чистый) способ.

|--main.py
|--sideproject/
|           |--sub_main.py
|           |--test.py
|           |--__init__.py

В main.py:

from sideproject import sub_main    

def func_in_main():
    return sub_main.func_in_sub_main()

if __name__ == "__main__":
    print(func_in_main())

В sub_main.py:

if __name__ == "__main__":
    # If sub_main is run directly.
    # Use regular imports.

    import test
    print(test.func_in_test())
else:
    # If sub_main is imported by main.
    # Need to do imports relative to package.

    from . import test
    def func_in_sub_main():
        return(test.func_in_test())

In test.py:

__all__ = ["func_in_test"]    

def func_in_test():
    return 123

In init.py: (пусто)

результат:

gino:test$ ls
total 8
-rw-rw-r-- 1 gino gino  150  1月 24 09:05 main.py
drwxrwxr-x 3 gino gino 4096  1月 24 08:57 sideproject
gino:test$ python3 main.py
123
gino:test$ cd sideproject
gino:test$ python3 sub_main.py
123

Но я бы посоветовал подумать о том, почему вам нужно запустить sub_main напрямую.Я рекомендую рассмотреть структурирование sideproject как пакета, используя sub_main как своего рода объявление публичного API (или объявление публичных API в init .py) затем всегда запускается приложение из main.py (импорт sideproject ).

...