Как импортировать класс в том же каталоге или подкаталоге?

У меня есть каталог, в котором хранятся все файлы .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()
from user import User 
from dir import Dir 

Я не уверен, почему это работает, но использую сборку 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

файл, кроме вас, то файлы

из каталога импортировать ваш_файл

Другие вопросы по тегам