117

I have a file structure like this:

Folder
   Common
      foo1.py
   TestFolder
      foo2.py

I want to import in foo2.py and foo1.py. I tried but it doesn't work on Ubuntu:

sys.path.append(os.path.abspath('../../'))
from Common import foo1.py
6
  • Do you have a __init__.py file in your folder? this is how python creates packages and allows you to import modules from that package.guide.python-distribute.org/creation.html
    – Bryan
    May 23, 2014 at 7:36
  • I have init.py file in Common and in TestFolder
    – user284474
    May 23, 2014 at 7:37
  • you need it in the Folder directory as well as in the sub folders if you want to import
    – Bryan
    May 23, 2014 at 7:38
  • 1
    This init.py is empty?
    – user284474
    May 23, 2014 at 7:41
  • 2
    yeah it can be empty. Unless you need a certain configuration for your package but you should be fine with it being empty
    – Bryan
    May 23, 2014 at 7:42

3 Answers 3

167

How python finds its modules

Strictly taken, a module is a single python file, while a package is a folder containing python files, accompanied by a (can be empty) file named __init__.py, to tell python it is a package to import modules from. In both cases, modules need their .py extension, but importing them is done without (see further below).

By default, Python looks for its modules and packages in $PYTHONPATH.

To find out what is included in $PYTHONPATH, run the following code in python (3):

import sys
print(sys.path)

How to add a directory

Occasionally

From within a python file, you can add path(s) occasionally to the default path by adding the following lines in the head section of your python application or script:

import sys
sys.path.insert(0, "/path/to/your/package_or_module")

For example:

if I have a folder: /home/myname/pythonfiles, and I want to import the file module_1.py, located in that directory, I add this to the head section of my code:

import sys
sys.path.insert(0, "/home/myname/pythonfiles")

And I can simply import the file module_1.py by:

import module_1

When I create a package and want to import module(s) from the package, I need to create a folder in $PYTHONPATH, containing the modules, accompanied by a (can be empty) file called __init__.py

For example:

To import from a package (folder) called my_package in /home/myname/pythonfiles , add the /home/myname/pythonfiles path to your $PYTHONPATH, like in example 1, and import the module called module_2.py (inside the package folder) simply with: `

from <packagename> import module_2

Adding directories to $PYTHONPATH permanently:

Add the following line to your ~/.profile file.

export PYTHONPATH=$PYTHONPATH:/path/you/want/to/add

Subdirectories

From within a package, subdirectories are not included just like that; you need to "chain" the directories. To import a module module_3.py, inside folder subfolder inside folder packagename:

import packagename.subfolder.module_3

Given the fact that all subfolders in the package include their own __init__.py file.

When a module is in the same directory as the script or application

There is no need to insert the path to a module when it is in the same directory as the script or application, it is automatically added.

Example:

If I have a folder, containing script.py and module.py, I can simply import the module by:

import module
4
  • 1
    I would also like to suggest reading python.org/dev/peps/pep-0328, specially if you're targeting Python 3 (or planning to target in the future)
    – zaadeh
    Oct 4, 2017 at 12:34
  • 1
    Why is printenv PYTHONPATH nothing?
    – tread
    Jun 14, 2018 at 12:57
  • 2
    sys.path.append("/path/to/your/package_or_module") also adds a path to the default and it is less confusing. Compared to sys.path.insert(0,...) which has 0 as a first argument. Jun 26, 2018 at 14:13
  • 3
    @PaulRougieux: The problem with appending to the path is that your module might already exist elsewhere in the path (in an .egg file for instance) and you'll pick up that version of your module instead of the one in your file.
    – snark
    Sep 5, 2018 at 10:21
7

The correct way to use relative import is:

from ..Common import foo1

And you also need a __init__.py in all your folders.

7
  • 1
    Thx. But if i have a module which is two folders Up how do i import that? from ....Folder is not working
    – user284474
    May 23, 2014 at 7:57
  • Does it work with a single level? May 23, 2014 at 8:03
  • With a single level it works.
    – user284474
    May 23, 2014 at 8:23
  • ok, could you please accept this answer? for multilevel though you could ask a different question but first take a look at this question and this answer for the best way to call your modules inside a package May 23, 2014 at 8:28
  • Is this true for Python 2 or Python 3? Or both?
    – alex
    Oct 11, 2017 at 11:28
3

NB: This answer is outdated for the latest version of python 3, but is here for earlier version. For more information read the comments and https://www.python.org/dev/peps/pep-0420/


Essentially every folder with python code you want to add to the syspath needs an __init__.py file. These __init__.py files can be empty.

3
  • As I understand it, this is no longer the case, the directory now becomes a "namespace".
    – Aaron Hall
    Apr 17, 2018 at 21:11
  • @AaronHall interesting, source?
    – don.joey
    Apr 24, 2018 at 12:12
  • 1
    Try this for evidence: python -c "from pathlib import Path; Path('ns').mkdir(); Path('ns/mod.py').write_text('''print('mod.py')'''); import ns.mod; from shutil import rmtree; rmtree('ns')" also here's some relevant documentation, PEP 420, which describes the addition of the namespace package semantics
    – Aaron Hall
    Apr 24, 2018 at 15:03

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .