我有一个使用git子模块的项目。在我的python文件中,我想在子模块项目中使用另一个python文件中的函数。
为了工作,我必须将 init .py文件添加到路径中的所有子文件夹。我的文件夹树如下:
myproj
├── gitmodules
│ ├── __init__.py
│ ├── __init__.pyc
│ └── mygitsubmodule
│ ├── __init__.py
│ ├── __init__.pyc
│ └── file.py
└── myfile.py
有没有办法让它在不触及mygitsubmodule的情况下工作?
由于
答案 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 上本地测试。