如何从 Git 子模块导入 Python 文件

34

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

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

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

有没有办法让它工作而不用触碰我的gitsubmodule?

谢谢。

3个回答

33

你可以在想要访问该模块的文件中将sys.path添加进去,类似于以下内容:

你可以在想要访问该模块的文件中将sys.path添加进去,类似于以下内容:

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

这个例子是添加一个原始字符串作为路径,以清楚地说明正在发生的事情。您真的应该使用下面描述的更复杂、系统独立的方法来确定和组装路径。

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


2
我希望有一种更简单的方法(只是为了导入而编辑sys.path..),但我猜可能没有其他办法来做到这一点 :) - pedrorijo91
12
sys.path 是 Python 的加载路径,不要与 $PATH 环境变量或其等效物混淆。它非常轻量级且易于添加,不会改变您的环境。编辑: 我建议在运行时计算路径而不是硬编码。可以使用当前路径 (os.path.dirname(os.path.abspath(__file__))) 和 os.path.join - Lewis Eason
请参考 https://dev59.com/nh79s4cB2Jgan1zna5MW#73885828,了解如何一次性对整个软件包进行此操作。 - DrCord

18

我习惯于避免修改sys.path

问题是,当使用git submodule时,子模块是一个项目目录,而不是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 了。


1
如果导入的文件不依赖于foo_project中的其他文件,那么这可能有效。但是,如果加载了json文件或其他内容,则会不幸地失败。 - Michael

4

作为参考,

       from submodulefolder.file import func_name   

或者
       import submodulefolder.file as lib_name

file 排除了 file.py 的扩展名,相对路径似乎可以在不修改子文件夹/ git 子模块的情况下工作并且不需要一个 init.py ,因为 Python 3.3+ 如此实现, 详见此处

已在 py3.8.5 linux 本机和 py3.7.8 anaconda Windows 上进行测试,在 Spyder 的 Ipython-console 中以及通过 终端 在 Linux 上本地运行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接