如何从 git 子模块导入 python 文件

How to import python file from git submodule

我有一个使用 git 子模块的项目。在我的 python 文件中,我想使用子模块项目中另一个 python 文件中的函数。

为了工作,我必须将 init.py 文件添加到路径中的所有子文件夹。我的文件夹树如下:

myproj
├── gitmodules
│   ├── __init__.py
│   ├── __init__.pyc
│   └── mygitsubmodule
│       ├── __init__.py
│       ├── __init__.pyc
│       └── file.py
└── myfile.py

有什么方法可以让它在不触及我的git子模块的情况下工作吗?

谢谢

你可以在你希望能够访问模块的文件中添加到 sys.path,例如:

import sys
sys.path.append("/home/me/myproj/gitmodules")
import mygitsubmodule

此示例将路径添加为原始字符串,以明确发生了什么。您真的应该使用下面描述的更复杂、系统独立的方法来确定和 assemble 路径。

此外,当我使用此方法时,我发现使用 sys.path.insert(1, .. 更好,因为某些功能似乎依赖于 sys.path[0] 作为程序的起始目录。

我习惯避免修改sys.path.

问题是,当使用git 子模块 时,子模块是项目目录,而不是Python 包。 你的模块那个包之间有一个"gap",所以你不能导入。

假设你创建了一个名为foo_project的子模块,里面有一个foo包。

.
├── foo_project
│   ├── README.rst
│   └── foo
│       └── __init__.py
└── main.py

我的解决方案是创建一个 soft link 以将该包公开给您的模块:

ln -s foo_project/foo foo
.
├── foo_project
│   ├── README.rst
│   └── foo
│       └── __init__.py
├── foo -> foo_project/foo
└── main.py

现在您可以在 main.py.

中导入 foo

供参考,

       from submodulefolder.file import func_name   

       import submodulefolder.file as lib_name

其中 file 排除了 file.py 的扩展名,似乎在不修改子文件夹 / git 子模块的情况下工作 , 如图所示 here.

在 py3.8.5 linux native 和 py3.7.8 anaconda Windows 上测试,都在 Spyder 的 Ipython-console 中,以及在 linux 上通过 terminal.