импорт git-субмодуля python из другого git-субмодуля - PullRequest
0 голосов
/ 03 сентября 2018

Использование Python 3.6 Я создал несколько модулей (таких как DBmanager или jsonParser и т. Д., Которые я использую в нескольких проектах Python)

Для простоты: я создал модуль, назовем его «gitmodule03». Внутренне предполагается использовать еще один модуль из github 'gitmodule01' для анализа данных. Я добавил 'gitmodule01' к 'gitmodule03' с помощью

'git submodule add http://git/gitmodule01'

Отдельно я разрабатываю свой «MainPackage», который будет использовать непосредственно «gitmodule03» и «gitmodule01» (среди прочих). Я добавил их все в свою основную программу с помощью

'git submodule add http://git/gitmodule01'
'git submodule add http://git/gitmodule02'
'git submodule add http://git/gitmodule03'

и мой пакет выглядит так:

.
└── MainPackage
    ├── modules
    │   ├── __init__.py
    │   ├── gitmodule01
    │   │   ├── __init__.py
    │   │   └── mymodule01.py
    │   ├── gitmodule02
    │   │   ├── __init__.py
    │   │   └── mymodule02.py
    │   ├── gitmodule03
    │   │   ├── __init__.py
    │   │   ├── mymodule03.py
    │   │   └── gitmodule01
    │   │       └── 
    │   └── mymodule04.py
    └── myMainProgram.py

В данный момент «gitmodule03» НЕ импортирует «gitmodule01» изнутри . Я надеялся, что импорт его в main myMainProgram.py будет распространяться по подмодулям (что не так)

Если мой myMainProgram.py импортирует их все:

from modules.gitmodule01.mymodule01 import my01class
from modules.gitmodule02.mymodule02 import my02class
from modules.gitmodule03.mymodule03 import my03class

my03class () # будет работать

my02class () # внутренне использует my03class () и выдает ошибку:

NameError: имя 'my03class' не определено

Как я могу спроектировать их так, чтобы они могли работать независимо, а также в больших упаковках, чистым, питонским способом?

Я бы хотел, чтобы эти модули были независимыми, чтобы им не приходилось использовать какие-либо жестко запрограммированные sys.path () методы

Редактировать тестовые случаи:

1

myMainProgram.py
sys.path.insert(0, "modules/gitmodule03/gitmodule01/")
from mymodule01 import my01class
from modules.gitmodule03.mymodule03 import my03class
my01class() #works
my03class() # NameError: name 'my01class' is not defined

2

myMainProgram.py
from modules.gitmodule03.gitmodule01.mymodule01 import my01class
from modules.gitmodule03.mymodule03 import my03class
my01class() #works
my03class() # NameError: name 'my01class' is not defined

3.

mymodule03.py
from gitmodule01.mymodule01 import my01class
my01class() #works

myMainProgram.py
from modules.gitmodule01.mymodule01 import my01class
from modules.gitmodule03.mymodule03 import my03class
my03class() # ModuleNotFoundError: No module named 'gitmodule01'

4

mymodule03.py
from .gitmodule01.mymodule01 import my01class
my01class() # ModuleNotFoundError: No module named '__main__.gitmodule01'; '__main__' is not a package

myMainProgram.py
from modules.gitmodule03.mymodule03 import my03class
my03class() # works

С Тестовым Примером # 4 Похоже, я мог бы заставить myMainProgram.py работать, но мне пришлось бы разбивать модуль самостоятельно.

1 Ответ

0 голосов
/ 03 сентября 2018

До сих пор я не мог найти лучшего варианта, чтобы и myMainProgram.py, и mymodule03.py работали самостоятельно. В данный момент я проверяю переменную name , чтобы видеть, работает ли модуль самостоятельно или когда он запускается из другого пакета:

mymodule03.py
if __name__ == '__main__':
    from gitmodule01.mymodule01 import my01class
    my01class() # works
else:
    from .gitmodule01.mymodule01 import my01class

myMainProgram.py
from modules.gitmodule03.mymodule03 import my03class
my03class() # works
...