969

I have a directory that stores all the .py files.

bin/ main.py user.py # where class User resides dir.py # where class Dir resides 

I want to use classes from user.py and dir.py in main.py.
How can I import these Python classes into main.py?
Furthermore, how can I import class User if user.py is in a sub directory?

bin/ dir.py main.py usr/ user.py 
2

20 Answers 20

1267

Python 2

Make an empty file called __init__.py in the same directory as the files. That will signify to Python that it's "ok to import from this directory".

Then just do...

from user import User from dir import Dir 

The same holds true if the files are in a subdirectory - put an __init__.py in the subdirectory as well, and then use regular import statements, with dot notation. For each level of directory, you need to add to the import path.

bin/ main.py classes/ user.py dir.py 

So if the directory was named "classes", then you'd do this:

from classes.user import User from classes.dir import Dir 

Python 3

Same as previous, but prefix the module name with a . if not using a subdirectory:

from .user import User from .dir import Dir 
Sign up to request clarification or add additional context in comments.

21 Comments

If __init__.py is not empty, then whatever is in __init__.py is what will be available when you import the package (and things not imported into __init__.py won't be available at all).
Why is an __init__.py file needed at all? If I put all three files in the same directory and run main.py, it's able to import from the other two modules fine without it. What am I missing?
You don’t need an __init__.py file if the directory containing your modules is already on sys.path. When you run python main.py, Python automatically adds the directory of main.py to sys.path, which is why imports from sibling modules work without __init__.py.
Because that's how Python identifies directories from which you're allowed to import. The directory of the script you're running is an exception - you're always allowed to import from it.
@nbro & Amber: FWIW, I think something subtle has changed with regards to __init__.py and being able to import other modules in the same directory. Specifically imports of other modules in the same directory as the __init__.py file itself which worked in Python 2.7.8, failed in Python 3.4.1. To fix it I had to prefix each of them with the subdirectory's name and a dot (i.e. import module had to be changed to import subdirectory.module). Fortunately it still worked in Python 2.7.8 after doing this.
I can confirm this solution is no longer functional. You might wish to correct, amend or outright delete it.
|
194

I just learned (thanks to martineau's comment) that, in order to import classes from files within the same directory, you would now write in Python 3:

from .user import User from .dir import Dir 

9 Comments

if i try this no i get the following error ValueError: Attempted relative import in non-package but error goes away when i change to from user import User
@Korpel: Following the discussions in stackoverflow.com/questions/11536764/… i come to realize that wether the above given import works or not depends on: [1] how your script is called (as package or not) [2] where the actual work path is when you execute it [3] how the path variable of your run environment is populated
Why is it so difficult to find a clear answer for this question? All I want to do is create a class in a seperate file and then import that class into a different file which is in the same directory. If I use a relative import like this answer I also get the VlaueError
Anyone have a solution to this yet? @Jiren did you find one? Seems like such a simple problem as you say...
@Korpel I got ImportError: attempted relative import with no known parent package, not sure if it's the same error, but I used from user.User import User, it worked.
|
87

From python3.3 upwards, __init__.py is no longer necessary. If the current directory of the console is the directory where the python script is located, everything works fine with

import user 

However, this won't work if called from a different directory, which does not contain user.py.
In that case, use

from . import user 

This works even if you want to import the whole file instead of just a class from there.

6 Comments

I'm using pylint in vs code, and was having trouble with a same-directory import always being flagged as an error (import user was underlined in red); changed to the relative import (from . import user) and the linter no longer flagged it.
how to do you fin the current directory
@xiaodai not sure what you mean. Does my second snippet not work for you? To answer your question itself, probably with os.getcwd() but that shouldn't be necessary
" from dog import Dog" works for me 3.9.2
As of python3.3 to be more precise. Thanks @lucidbrot, interesting contribution!
|
55

In your main.py:

from user import Class 

where Class is the name of the class you want to import.

If you want to call a method of Class, you can call it using:

Class.method

Note that there should be an empty __init__.py file in the same directory.

2 Comments

What do you do if the module you're trying to import has no classes? Just raw functions? In python 2 all I had to do was 'import module'. Doesn't work in python 3, neither does 'import .module'
This works in python3 after deleted the __init__.py.
23

If user.py and dir.py are not including classes then

from .user import User from .dir import Dir 

is not working. You should then import as

from . import user from . import dir 

2 Comments

could you clarify on what you mean by 'not including classes'?
I mean that in the file.py there are defined only variables and functions def and no classes as described here
16

You can import the module and have access through its name if you don't want to mix functions and classes with yours

import util # imports util.py util.clean() util.setup(4) 

or you can import the functions and classes to your code

from util import clean, setup clean() setup(4) 

you can use wildchar * to import everything in that module to your code

from util import * clean() setup(4) 

1 Comment

import * is not recommended anymore
14

For Python 3+, suppose you have this structure:

A/ __init__.py bar.py foo.py 

In your __init__.py file, you can put from . import foo

then you can import foo in bar file

# A/bar.py from foo import YourClass 

The purpose of the __init__.py files is to include optional initialization code that runs as different levels of a package are encountered. everything you put in the __init__.py will be initialized during the package load.

1 Comment

This was the only solution that worked for me
12

To make it more simple to understand:

Step 1: lets go to one directory, where all will be included

$ cd /var/tmp 

Step 2: now lets make a class1.py file which has a class name Class1 with some code

$ cat > class1.py <<\EOF class Class1: OKBLUE = '\033[94m' ENDC = '\033[0m' OK = OKBLUE + "[Class1 OK]: " + ENDC EOF 

Step 3: now lets make a class2.py file which has a class name Class2 with some code

$ cat > class2.py <<\EOF class Class2: OKBLUE = '\033[94m' ENDC = '\033[0m' OK = OKBLUE + "[Class2 OK]: " + ENDC EOF 

Step 4: now lets make one main.py which will be execute once to use Class1 and Class2 from 2 different files

$ cat > main.py <<\EOF """this is how we are actually calling class1.py and from that file loading Class1""" from class1 import Class1 """this is how we are actually calling class2.py and from that file loading Class2""" from class2 import Class2 print Class1.OK print Class2.OK EOF 

Step 5: Run the program

$ python main.py 

The output would be

[Class1 OK]: [Class2 OK]: 

1 Comment

And what happens if this doesn't work and main.py can't read class1 or class2?... what are we missing?
11

Python 3


Same directory.

import file:log.py

import class: SampleApp().

import log if __name__ == "__main__": app = log.SampleApp() app.mainloop() 

or

directory is basic.

import in file: log.py.

import class: SampleApp().

from basic import log if __name__ == "__main__": app = log.SampleApp() app.mainloop() 

1 Comment

the most easiest to understand answer
8
from user import User from dir import Dir 

2 Comments

This worked for me without having init.py file for both Python 2.7 and Python 3.6.
@imsrgadich it works as long as you're running python in the directory containing the files. This is an exception. See this comment
6

I'm not sure why this work but using Pycharm build from file_in_same_dir import class_name

The IDE complained about it but it seems it still worked. I'm using Python 3.7

1 Comment

Use absolute path. from bin.user import User assuming bin is the root directory. Also this works for both python 2 and python 3.
4

Indeed Python does not provide an elegant solution for this everyday use-case. It is especially problematic when you are testing your code that eventually will be delivered as part of a Python package. Here is an approach that has worked for me:

dir |

  • file1.py
  • file2.py

And let's say you want to import file2 from file1.

# In file1.py: try: # This works when packaged as Python package from . import file2 except: # This works when simply invoking file1 as a module (i.e. python file1) import file2 # rest of the code ... 

Comments

3

For python3

import from sibling: from .user import User
import from nephew: from .usr.user import User

1 Comment

This works. from file import MyClass doesn't work if package is installed via pipx, but does work when installed with pip. from .file import MyClass however is OK.
1

If you have filename.py in the same folder, you can easily import it like this:

import filename 

I am using python3.7

Comments

1

I cannot submit an edit for the top answer, so based on some pointers given in comments above, another thing to try out is:

from subfolder.MyClassFile import MyClass 

And that's it. Just remember to have an __init__.py empty file in our subfolder.

Just for reference, the solution works if your structure is something like this:

your_project/ __ini__.py main.py subfolder/ __init__.py MyClassFile.py <-- You want this 

MyClassFile.py contains the class MyClass.

Comments

0

Python3

use

from .user import User inside dir.py file 

and

use from class.dir import Dir inside main.py or from class.usr import User inside main.py 

like so

1 Comment

This answer doesn't really add anything more than the other answer already do, and has no explanation. Is there some way you could edit your answer to add to or improve it? Because otherwise, it stands to be downvoted like this answer was or removed entirely.
0
# My Python version: 3.7 # IDE: Pycharm 2021.1.2 Community # Have "myLib" in folder "labs": class Points: def __init__(self, x = 0, y = 0): self.__x = x self.__y = y def __str__(self): return f"x = {self.__x}, y = {self.__y}" # Have "myFile" in (same) folder "labs": from myFile import Point p1 = Point(1, 4) p2 = Point(1, 4) print(f"p1: {p1}, p2: {p2}") # Result: # p1: x = 1, y = 4, p2: x = 1, y = 4 # Good Luck! 

1 Comment

Code-only answers are not particularly helpful. Please add some descriptions of how this code solves the problem.
0

In a sufficiently complicated project, we can't do hello world with python imports. When all else fails I had some success with the following

sys.path.append(os.path.join(pathlib.Path(__file__).parent.resolve())) 

Comments

-2

Just too brief, Create a file __init__.py is classes directory and then import it to your script like following (Import all case)

from classes.myscript import * 

Import selected classes only

from classes.myscript import User from classes.myscript import Dir 

1 Comment

Wildcard imports as seen in this answer are generally considered bad style as described in PEP 8.
-3

to import from the same directory

from . import the_file_you_want_to_import 

to import from sub directory the directory should contain

init.py

file other than you files then

from directory import your_file

1 Comment

I don't think this answer adds anything that other answers did not, and also is not a comprehensive summary of the other answers. So I wonder why you wrote it

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.