xxxxxxxxxx
#Unfortunately, Python will only find your file if your file is in the systems path. But fear not! There is a way around this!
#Using python's sys module, we can add a directory to the path just while Python is running, and once Python stops running, it will remove it from the path.
#You can do this by:
import sys
sys.path.insert(0, '/path/to/application/app/folder')
import [file]
xxxxxxxxxx
import sys
# sys.path is a list of absolute path strings
sys.path.append('/path/to/application/app/folder')
import file
xxxxxxxxxx
import sys
# sys.path is a list of absolute path strings
sys.path.append('/path/to/application/app/folder') # <-- relative path
import your_file
xxxxxxxxxx
import sys
sys.path.insert(0, 'path/to/your/py_file')
import py_file
import file in python from another folder
xxxxxxxxxx
# Tested with python 3.10.8
# Modified from Stack Overflow:
'''
application
│ main.py
├── app
│ └── folder
│ └── file1.py
└── app2
└── some_folder
└── file2.py
'''
# Given the cwd as `application`
# You can import `file1.py` in `main.py` as such:
import app.folder.file1
# Along with `file2.py`
import app2.some_folder.file2
# Then call the function `foo` from file.py
app.folder.file1.foo()
# As well as `bar` from file2.py
app2.some_folder.file2.bar()
# You can also import specific functions
from app.folder.file1 import foo
from app2.some_folder.file2 import bar
# Using the imported functions
foo()
bar()
# Also possible, though this can lead to naming conflicts
from app.folder.file1 import *
from app2.some_folder.file2 import *
########################################
# You can also import multiple modules from a folder
# Ensure there's an `__init__.py` file in the subdir
'''
application
│ main.py
└── app
└── folder
└── __init__.py
└── file1.py
└── file2.py
'''
# From the `__init__.py` file import your modules
from .file1 import *
from .file2 import bar
# In our `main.py` we can now import
from app.folder import *
foo()
bar()
If you're importing through the wildcard, be careful as it can lead to naming conflicts if the imported modules define names with the same names in your `main.py`
xxxxxxxxxx
# By default, you can't. When importing a file, Python only
# searches the current directory, the directory that the
# entry-point script is running from, and sys.path which includes
# locations such as the package installation directory
# (it's actually a little more complex than this, but this covers
# most cases).
# you can however, add to the path at runtime
import sys
# insert at position 1 in the path, as 0 is the path of this file.
sys.path.insert(1, '/path/to/application/app/folder')
import file
file.function()
xxxxxxxxxx
The solution is very simple, just add a __init__.py file to the directory
where the package or code you want to import is, and then python will treat
that directory as a package. Then is as simple as just importing the code
like any other third party package. Below is a diagram of best practices
doing this.
package/
|
|----- __init__.py (Empty file)
|------- main_module.py (Contains: import subpackage_1.module_1)
|------- module_0.py (Contains: print('module_0 at parent directory, is imported'))
|
|
|------- subpackage_1/
| |
| |----- __init__.py (Empty file)
| |----- module_1.py (Contains: print('importing other modules from module_1...')
| | import module_0
| | import subpackage_2.module_2
| | import subpackage_1.sub_subpackage_3.module_3)
| |----- photo.png
| |
| |
| |----- sub_subpackage_3/
| |
| |----- __init__.py (Empty file)
| |----- module_3.py (Contains: print('module_3 at sub directory, is imported'))
|
|------- subpackage_2/
| |
| |----- __init__.py (Empty file)
| |----- module_2.py (Contains: print('module_2 at same level directory, is imported'))
xxxxxxxxxx
# some_file.py
import sys
# insert at 1, 0 is the script path (or '' in REPL)
sys.path.insert(1, '/path/to/application/app/folder')
import file
xxxxxxxxxx
import sys
# sys.path is a list of absolute path strings
sys.path.append('/path/to/application/app/folder')