Импорт файла в тот же подкаталог модуля - PullRequest
0 голосов
/ 16 июня 2020

Мой код структурирован следующим образом:

proj/
    __init__.py
    main.py
    subdir/
          __init__.py
          module1.py
          module2.py

module1.py использует module2.py. и main.py использует module1.py и module2.py

Мне удалось заставить его работать:

import subdir.module1 и import subdir.module2 в main.py

from .module2 import Module2 in module1.py

Проблема, с которой я сейчас сталкиваюсь, заключается в том, чтобы сделать module1 исполняемым скриптом. При попытке запустить его напрямую я получаю сообщение об ошибке:

Traceback (most recent call last):                                                                                                   
  File "module1.py", line 1, in <module>                                                                                             
    from .module2 import Module2                                                                                                     
ModuleNotFoundError: No module named '__main__.module2'; '__main__' is not a package

Есть ли способ сделать модули внутри подкаталога непосредственно исполняемыми, оставаясь при этом доступными для импорта из основного скрипта?

Код для main.py :

import subdir.module1 as module1                                                                                                     
import subdir.module2 as module2                                                                                                     

module1.main() 

Код для module1.py:

from .module2 import Module2                                                                                                         

class Module1:
    pass

def main():
    m = Module2()

if __name__ == "__main__":
    main()

Код для module2.py :

class Module2:
    pass

__init__ .py файлы пусты

Ответы [ 2 ]

1 голос
/ 16 июня 2020

Python следует модели выполнения, очень близкой к обычным программам на вашем компьютере. Программа (или python скрипт) находится где-то в $PATH, а все библиотеки, которые она загружает (или python модуль), находятся в другом определенном системой месте. Python намеревается установить. Сценарии помещаются в PATH, а модули зарыты где-то в каталогах python.

Единственным исключением является то, что при запуске сценария python добавляет свой каталог к ​​пути python для модулей. Таким образом, любой из его подкаталогов, в котором есть __init__.py, становится python пакетами. Когда вы запускаете main.py, это сценарий, а subdir - пакет. Это позволяет module1.py выполнять относительный импорт пакетов. Интересно, что main.py сам по себе не находится в пакете, __init__.py на его уровне не импортируется.

Когда вы запускаете module1.py как сценарий, это тоже не пакет. Таким образом, относительный импорт пакетов больше не работает.

Решение состоит в go, сделав все это устанавливаемым пакетом. Вы определяете setup.py, и, ну, есть несколько вариантов того, как это настроить. setuptools - хороший ресурс. Следует отметить параметр console_scripts, который автоматически генерирует скрипты из точек входа в модуль.

Это большой холм, на который нужно подняться, но как проекты go за пределами одного или двух модулей , стоит боли.

0 голосов
/ 16 июня 2020

В основном все связано с «текущим рабочим каталогом». Часто это форма папки, в которой вы запускаете исходный код, независимо от того, какой файл выполняет оператор import. Итак, в вашем случае вам, вероятно, придется сделать:

from subdir import module1 as m1

или что-то подобное, независимо от того, в какой папке находится этот файл, который выполняет импорт.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...