Как импортировать класс в том же каталоге или подкаталоге?
У меня есть каталог, в котором хранятся все файлы .py.
bin/
main.py
user.py # where class User resides
dir.py # where class Dir resides
Я хочу использовать классы из user.py и dir.py в main.py.
Как я могу импортировать эти классы Python в main.py?
Кроме того, как я могу импортировать класс User
если user.py находится в подкаталоге?
bin/
dir.py
main.py
usr/
user.py
20 ответов
Python 2
Сделать пустой файл с именем __init__.py
в том же каталоге, что и файлы. Это будет означать для Python, что "можно импортировать из этого каталога".
Тогда просто делай...
from user import User
from dir import Dir
То же самое верно, если файлы находятся в подкаталоге - поместите __init__.py
в подкаталоге, а затем используйте обычные операторы импорта с точечной нотацией. Для каждого уровня каталога, вы должны добавить к пути импорта.
bin/
main.py
classes/
user.py
dir.py
Итак, если каталог был назван "классы", то вы бы сделали это:
from classes.user import User
from classes.dir import Dir
Python 3
То же, что и предыдущий, но префикс имени модуля с .
если не использовать подкаталог:
from .user import User
from .dir import Dir
Я только что узнал (благодаря комментарию Мартино), что для того, чтобы импортировать классы из файлов в одном и том же каталоге, вы теперь должны написать в Python 3:
from .user import User
from .dir import Dir
В python3 __init__.py
больше не нужно Если текущим каталогом консоли является каталог, в котором находится скрипт Python, все работает нормально
import user
Тем не менее, это не будет работать, если вызывается из другого каталога, который не содержит user.py
,
В этом случае используйте
from . import user
Это работает, даже если вы хотите импортировать весь файл, а не просто класс оттуда.
В вашем main.py
:
from user import Class
где Class
Имя класса, который вы хотите импортировать.
Если вы хотите вызвать метод Class
Вы можете позвонить, используя:
Class.method
Обратите внимание, что должен быть пустой __init__.py
файл в том же каталоге.
Если user.py и dir.py не включают классы, тогда
from .user import User
from .dir import Dir
не работает. Затем вы должны импортировать как
from . import user
from . import dir
Вы можете импортировать модуль и получить доступ через его имя, если не хотите смешивать функции и классы с вашими.
import util # imports util.py
util.clean()
util.setup(4)
или вы можете импортировать функции и классы в свой код
from util import clean, setup
clean()
setup(4)
вы можете использовать wildchar *, чтобы импортировать все в этом модуле в ваш код
from util import *
clean()
setup(4)
Чтобы было проще понять:
Шаг 1: давайте перейдем в один каталог, где все будет включено
$ cd /var/tmp
Шаг 2: теперь давайте создадим файл class1.py с именем класса Class1 с некоторым кодом
$ cat > class1.py <<\EOF
class Class1:
OKBLUE = '\033[94m'
ENDC = '\033[0m'
OK = OKBLUE + "[Class1 OK]: " + ENDC
EOF
Шаг 3: теперь давайте создадим файл class2.py с именем класса Class2 с некоторым кодом
$ cat > class2.py <<\EOF
class Class2:
OKBLUE = '\033[94m'
ENDC = '\033[0m'
OK = OKBLUE + "[Class2 OK]: " + ENDC
EOF
Шаг 4: теперь давайте создадим один main.py, который будет выполнен один раз, чтобы использовать Class1 и Class2 из 2 разных файлов.
$ 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
Шаг 5: Запустите программу
$ python main.py
Выход будет
[Class1 OK]:
[Class2 OK]:
Для Python 3+ предположим, что у вас есть такая структура:
A/
__init__.py
bar.py
foo.py
В свой файл вы можете поместить
from . import foo
тогда вы можете импортировать foo в файл бара
# A/bar.py
from foo import YourClass
Файлы предназначены для включения дополнительного кода инициализации, который запускается при обнаружении разных уровней пакета. все, что ты вкладываешь в
__init__.py
будет инициализирован во время загрузки пакета.
Python 3
Так же directory
,
импортировать файл:log.py
класс импорта: SampleApp()
,
import log
if __name__ == "__main__":
app = log.SampleApp()
app.mainloop()
или же
каталог basic
,
импортировать в файл: log.py
,
класс импорта: SampleApp()
,
from basic import log
if __name__ == "__main__":
app = log.SampleApp()
app.mainloop()
Я не уверен, почему это работает, но использую сборку Pycharm from file_in_same_dir import class_name
IDE жаловалась на это, но, похоже, все еще работало. Я использую Python 3.7
Для python3
импорт из родного брата:
from .user import User
импорт от племянника:
from .usr.user import User
Если у тебя есть
filename.py
в той же папке вы можете легко импортировать его следующим образом:
import filename
Я использую python3.7
Я не могу отправить редактирование для верхнего ответа, поэтому, основываясь на некоторых указателях, приведенных в комментариях выше, можно попробовать еще одну вещь:
from subfolder.MyClassFile import MyClass
Вот и все. Просто не забудьте иметь__init__.py
пустой файл в нашемsubfolder
.
Просто для справки, решение работает, если ваша структура выглядит примерно так:
your_project/
__ini__.py
main.py
subfolder/
__init__.py
MyClassFile.py <-- You want this
MyClassFile.py
содержит классMyClass
.
# 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!
В достаточно сложном проекте мы не можем передать hello world с помощью импорта Python. Когда все остальное терпит неудачу, я добился некоторого успеха со следующим
sys.path.append(os.path.join(pathlib.Path(__file__).parent.resolve()))
Действительно, Python не предлагает элегантного решения для повседневного использования. Это особенно проблематично, когда вы тестируете свой код, который в конечном итоге будет поставляться как часть пакета Python. Вот подход, который сработал для меня:
реж |
- файл1.py
- файл2.py
И допустим, вы хотите импортировать файл2 из файла1.
# 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 ...
Python3
использовать
from .user import User inside dir.py file
а также
use from class.dir import Dir inside main.py
or from class.usr import User inside main.py
вот так
Просто слишком кратко, создайте файл __init__.py
это каталог классов, а затем импортировать его в свой скрипт, как показано ниже
from classes.myscript import *
Импортировать из той же директории
from . import the_file_you_want_to_import
для импорта из подкаталога каталог должен содержать
init.py
файл, кроме вас, то файлы
из каталога импортировать ваш_файл