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
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
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
ValueError: Attempted relative import in non-package
but error goes away when i change to from user import User
from user.User import User
, no .
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.
__init__.py
.
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.
import user
was underlined in red); changed to the relative import (from . import user
) and the linter no longer flagged it.
os.getcwd()
but that shouldn't be necessary
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
file.py
there are defined only variables and functions def
and no classes as described here
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)
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]:
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()
from user import User
from dir import Dir
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
from bin.user import User
assuming bin is the root directory. Also this works for both python 2 and python 3.
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.
For python3
import from sibling: from .user import User
import from nephew: from .usr.user import User
If you have filename.py
in the same folder, you can easily import it like this:
import filename
I am using python3.7
# 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!
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
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
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
Success story sharing
__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).__init__.py
file needed at all? If I put all three files in the same directory and runmain.py
, it's able toimport
from the other two modules fine without it. What am I missing?__init__.py
and being able to import other modules in the same directory. Specificallyimport
s 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 toimport subdirectory.module
). Fortunately it still worked in Python 2.7.8 after doing this.