繁体   English   中英

无法从 git 子模块导入

[英]Cannot import from a git submodule

我在使 git 子模块工作时遇到困难。

我有一个项目ProjectA ,它基本上是一个mainA.py文件和一个包含库文件的子文件夹: mainA.py包含一个MainClass ,它基本上应该被调用,而Libraries只包含用于计算的脚本和类。

ProjectA/
    Libraries/
        __init__.py
        library1.py
        library2.py
    __init__.py
    mainA.py

mainA.py我只是做这样的事情:

# content of mainA.py
from Libraries.library1 import ClassA, ClassB

class MainClass:
    # do stuff

if __name__ == '__main__':
    MainClass()

这很好用,但我现在有一个ProjectB需要使用来自ProjectAMainClass ,所以我决定将ProjectA作为ProjectB的 git 子模块

git submodule add ProjectA_git_url

ProjectB/
    ProjectA/
    mainB.py
    .gitmodules

但是现在mainB.py我试图导入MainClassprojectA

# content of mainB.py
from ProjectA.mainA import MainClass

ModuleNotFoundError: No module named 'Libraries'

我认为这是因为现在Libraries不再挂在根目录中,而是挂在子模块ProjectA ,所以当mainA.py这样做时:

from Libraries.library1 import ClassA, ClassB

系统找不到Libraries 如果我将mainA.py更改为:

from ProjectA.Libraries.library1 import ClassA, ClassB

然后它就可以工作了,但当然我不想改变任何内部的ProjectA ,它只是一个应该独立工作或作为另一个项目的子模块工作的项目

我究竟做错了什么? ProjectA是子模块时,有没有办法从mainA.py导入MainClass

git是一个开发工具; 您在开发期间使用它,而不是在部署期间使用它。 pip是一个部署工具; 在开发过程中,您使用它来安装必要的库; 在部署期间,您的用户使用它来安装具有依赖项的包。

当您需要开发环境中的远程存储库中的某些内容时,请使用子模块。 例如,如果所述远程存储库包含您需要的 Makefile(s) 或其他非 python 文件,并且通常不会与pip安装。

也就是说,在您的情况下,您不应将ProjectA ProjectB的子模块,而应将ProjectA Python 依赖项。 ProjectAProjectB创建包并单独安装它们,但允许ProjectBProjectA导入。

依赖项在setup.pyrequirements.txt中声明。

也就是说,如果您坚持使用子模块:要么您必须自己操作sys.path要么您在mainA.py进行相对导入:

from .Libraries.library1 import ClassA, ClassB

将子模块路径添加到 mainB.py 中的系统路径假设您的子模块路径是“../ProjectB/ProjectA” sys.path.append(../ProjectB/ProjectA) 解决问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM