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

ped*_*o91 15 python python-import git-submodules

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

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

myproj
??? gitmodules
?   ??? __init__.py
?   ??? __init__.pyc
?   ??? mygitsubmodule
?       ??? __init__.py
?       ??? __init__.pyc
?       ??? file.py
??? myfile.py
Run Code Online (Sandbox Code Playgroud)

有没有办法让它工作而不触及mygitsubmodule?

谢谢

Kev*_*vin 16

我习惯于避免修改sys.path

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

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

.
??? foo_project
?   ??? README.rst
?   ??? foo
?       ??? __init__.py
??? main.py
Run Code Online (Sandbox Code Playgroud)

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

ln -s foo_project/foo foo
Run Code Online (Sandbox Code Playgroud)
.
??? foo_project
?   ??? README.rst
?   ??? foo
?       ??? __init__.py
??? foo -> foo_project/foo
??? main.py
Run Code Online (Sandbox Code Playgroud)

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


pad*_*dyg 12

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

import sys
sys.path.append("/home/me/myproj/gitmodules")
import mygitsubmodule
Run Code Online (Sandbox Code Playgroud)

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

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

  • @ pedrorijo91:`sys.path`是Python加载路径,不要与`$ PATH`环境变量或它的等价物混淆.添加它非常轻量级,并且不会改变您的环境.**编辑:**我建议在运行时编写路径而不是硬编码.涉及当前路径的东西(`os.path.dirname(os.path.abspath(__ file __))`)和`os.path.join` (9认同)
  • 我希望采用一种不那么棘手的方法(只是为了导入而编辑 sys.path ..),但我想可能无法以其他方式做到这一点:) (2认同)