Bin Chen
Bin Chen

Reputation: 63359

How to import the class within the same directory or sub directory?

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

Upvotes: 961

Views: 1722316

Answers (20)

Niklas Rosencrantz
Niklas Rosencrantz

Reputation: 26662

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()))

Upvotes: 0

absay
absay

Reputation: 196

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.

Upvotes: 1

Aakash Sahai
Aakash Sahai

Reputation: 21

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 ...

Upvotes: 2

lucidbrot
lucidbrot

Reputation: 6188

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.

Upvotes: 85

minglyu
minglyu

Reputation: 3337

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.

Upvotes: 13

Andreas Klein
Andreas Klein

Reputation: 1

# 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!

Upvotes: 0

kobako
kobako

Reputation: 673

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

import filename

I am using python3.7

Upvotes: 1

Iceberg
Iceberg

Reputation: 3402

For python3

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

Upvotes: 2

stingMantis
stingMantis

Reputation: 340

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

Upvotes: 5

icharis
icharis

Reputation: 271

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

Upvotes: 0

Andreas Foteas
Andreas Foteas

Reputation: 452

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

Upvotes: 22

Robel Asgedom
Robel Asgedom

Reputation: 11

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

Upvotes: -3

Hafiz Muhammad Shafiq
Hafiz Muhammad Shafiq

Reputation: 8678

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

Upvotes: -2

Yasith Praharshana
Yasith Praharshana

Reputation: 109

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()

Upvotes: 10

user285594
user285594

Reputation:

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]:

Upvotes: 11

A.Zaben
A.Zaben

Reputation: 681

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)

Upvotes: 15

Amber
Amber

Reputation: 527238

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

Upvotes: 1261

user225312
user225312

Reputation: 131777

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.

Upvotes: 54

ecp
ecp

Reputation: 2429

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

Upvotes: 191

ceth
ceth

Reputation: 45325

from user import User 
from dir import Dir 

Upvotes: 7

Related Questions