python git-子模块从其他 git-子模块导入
python git-submodule importing from other git-submodule
使用Python 3.6
我确实创建了多个模块(比如我在多个不同的 python 项目中使用的 DBmanager 或 jsonParser 等)
为简单起见:我创建了一个模块,我们称它为'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: name 'my03class' 未定义
我如何设计它们,使它们既可以独立工作,又可以在更大的包中以干净、pythonic 的方式工作?
我想让这些模块独立,这样它们就不必使用任何硬编码 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 工作,但我必须自行破坏模块。
到目前为止,我找不到更好的选择来让 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
使用Python 3.6 我确实创建了多个模块(比如我在多个不同的 python 项目中使用的 DBmanager 或 jsonParser 等)
为简单起见:我创建了一个模块,我们称它为'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: name 'my03class' 未定义
我如何设计它们,使它们既可以独立工作,又可以在更大的包中以干净、pythonic 的方式工作?
我想让这些模块独立,这样它们就不必使用任何硬编码 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 工作,但我必须自行破坏模块。
到目前为止,我找不到更好的选择来让 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