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

时间:2015-04-20 11:44:10

标签: python git-submodules python-import

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

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

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

有没有办法让它在不触及mygitsubmodule的情况下工作?

由于

3 个答案:

答案 0 :(得分:12)

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

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

编辑:这个例子是添加一个路径作为原始字符串,以明确发生了什么。您应该使用下面描述的更复杂的,与系统无关的方法来确定和组装路径。

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

答案 1 :(得分:9)

我习惯避免修改 sys.path

问题是,当使用 git子模块时,子模块是项目目录,而不是Python包。 您的模块该软件包之间存在一个“间隙”,因此您无法导入。

假设您创建了一个名为 foo_project 的子模块,并且内部有一个 foo 包。

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

我的解决方案将创建一个软链接,以将该软件包公开给您的模块:

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

现在,您可以在 main.py 中导入 foo

答案 2 :(得分:0)

供参考,

       from submodulefolder.file import func_name   

       import submodulefolder.file as lib_name

其中 file 不包括 file.py 的扩展名,似乎在不修改带有 init.py since python 3.3+ 的子文件夹 / git 子模块的情况下相对工作, 如图所示here

在 py3.8.5 linux native 和 py3.7.8 anaconda Windows 上测试,均在 Spyder 的 Ipython 控制台中,以及通过 terminal 在 linux 上本地测试。