How to Import Python File from Git Submodule

How to Import Python File from Git Submodule

I've a project which uses git submodules. In my python file I want to use functions from another python file in the submodule project.

In order to work I had to add the init.py file to all subfolders in the path. My folder tree is the following:

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

Is there any way to make it work without touching mygitsubmodule ?

Thanks

3 Answers

you can add to sys.path in the file you want to be able to access the module, something like:

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

This example is adding a path as a raw string to make it clear what's happening. You should really use the more sophisticated, system independent methods described below to determine and assemble the path.

Also, I have found it better, when I used this method, to use sys.path.insert(1, .. as some functionality seems to rely of sys.path[0] being the starting directory of the program.

2

I am used to avoiding modifying sys.path.

The problem is, when using git submodule, submodule is a project directory, not a Python package. There is a "gap" between your module and that package, so you can't import.

Suppose you have created a submodule named foo_project, and there is a foo package inside.

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

My solution will be creating a soft link to expose that package to your module:

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

Now you can import foo in the main.py.

1

For reference,

       from submodulefolder.file import func_name   

or

       import submodulefolder.file as lib_name

where file excludes the extension of file.py, seems to work in relative terms without modifying the subfolder / git submodule with a init.py since python 3.3+, as shown here.

Tested on py3.8.5 linux native and py3.7.8 anaconda Windows, both in Spyder's Ipython-console, as well as natively on linux via terminal.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Robert Thorne
Author

Robert Thorne

Robert Thorne covers electric vehicle innovations, autonomous driving systems, global mobility trends, and automotive engineering developments.