How To Import From Another Folder In Python?


How To Import From Another Folder In Python?

Python has a bit of a unique import system, if you’re trying to import files from a directory outside of your package, you might run into some trouble.

By default Python does not allow importing files from arbitrary directories, but there is a workaround: you can add the directory to your PYTHONPATH env var or insert it into the sys.path variable.

In this short tutorial, I’ll show you how to do this, explain why it’s not a good idea, and show some better ways to fix this problem.

1. Add The Folder To Your PYTHONPATH Environment Variable

When you try to import something in Python, the interpreter will first look for a builtin module.

If no builtin module is found, Python falls back to searching in the current working directory.

If the module is not found there, the Python engine will try all the directories listed in the sys.path system variable. When starting the script, this variable is initialized from the PYTHONPATH environment variable.

To add an extra import source folder, before running your script, run one of the following snippets (depending on your OS):

On Linux Or MacOS

export PYTHONPATH=/path/to/file/:$PYTHONPATH

Windows

set PYTHONPATH=C:\path\to\file\;%PYTHONPATH%

As you can see PYTHONPATH contains a list of directories, separated by :. We inserted /path/to/file/ (or \path\to\file) at the beginning of the string, so this will be the first place where Python will look for files to import.

2. Add The Folder To sys.path

If you cannot or do not want to modify your env vars, there is an alternative: you can also directly modify the sys.path variable at runtime.

You can insert your directory at the beginning of the list of the available import paths by adding these two lines of code to your Python script (before the import statement):

import sys
sys.path.insert(1, '/path/to/file/')

This will have exactly the same effect as modifying your PYTHONPATH.

Troubleshooting: Make Sure You Have an __init__.py File In The Containing Folder

If you still have issues importing the files you want, make sure that the containing directory has an __init__.py file. This is used to mark the folder as a valid Python package. If your folder does not have one, you won’t be able to import files from there, as the Python interpreter only allows importing from packages, and not from standalone files.

Disclaimer: Probably There’s A Better Way To Solve Your Problem

You might notice, that Python does not make importing files from arbitrary folders easy, and there is a good reason for that. Tinkering with sys.path or PYTHONPATH is probably not a good idea. In some cases it can be used as a quick hack to test something, but definitely should not be used in production.

It makes your system quite brittle, and can also cause serious security issues. There are better ways to go about it:

1. Simply Include The File You Want To Import In Your Project.

Just copy/move the file into a subdirectory in your working folder. Maybe create a submodule for it.

2. Install It In A Proper Location

If it is part of a third party package, chances are you can just install it with pip. Pip - the default Python package manager - will copy it to its proper place: some system-specific directory (like /usr/lib/python/), which is already contained in your PYTHONPATH, so the Python interpreter can automatically find it without the need to tweak your env vars.

3. Create Your Own Package

If it’s not 3rd-party code, but only loosely related to your current project, or it’s something like a library of classes/functions that you reuse in multiple projects, then the best way would probably be to bundle it up and create your own package. That way you can treat it exactly like a 3rd party pip package.