Вопрос-Ответ

How do I import other Python files?

Как мне импортировать другие файлы Python?

Как мне импортировать файлы в Python? Я хочу импортировать:


  1. файл (например, file.py)

  2. папка

  3. файл создается динамически во время выполнения на основе ввода пользователем

  4. одна определенная часть файла (например, отдельная функция)

Переведено автоматически
Ответ 1

Существует множество способов импортировать файл python, у каждого из которых есть свои плюсы и минусы.

Не выбирайте поспешно первую стратегию импорта, которая подходит именно вам, иначе вам придется переписывать кодовую базу позже, когда вы обнаружите, что она не соответствует вашим потребностям.

Я начну с объяснения самого простого примера № 1, затем перейду к наиболее профессиональному и надежному примеру № 7

Пример 1, Импортируйте модуль python с помощью интерпретатора python:


  1. Поместите это в /home/el/foo/fox.py:


    def what_does_the_fox_say():
    print("vixens cry")

  2. Получить доступ к интерпретатору python:


    el@apollo:/home/el/foo$ python
    Python 2.7.3 (default, Sep 26 2013, 20:03:06)
    >>> import fox
    >>> fox.what_does_the_fox_say()
    vixens cry
    >>>

    Вы импортировали fox через интерпретатор python, вызвали функцию python what_does_the_fox_say() изнутри fox.py.


Пример 2, используйте execfile или (exec в Python 3) в скрипте для выполнения другого файла python на месте:


  1. Поместите это в /home/el/foo2/mylib.py:


    def moobar():
    print("hi")

  2. Поместите это в /home/el/foo2/main.py:


    execfile("/home/el/foo2/mylib.py")
    moobar()

  3. запустите файл:


    el@apollo:/home/el/foo$ python main.py
    hi

    Функция moobar была импортирована из mylib.py и стала доступной в main.py


Пример 3, использование from ... импорт ... функциональность:


  1. Поместите это в /home/el/foo3/chekov.py:


    def question():
    print "where are the nuclear wessels?"

  2. Поместите это в /home/el/foo3/main.py:


    from chekov import question
    question()

  3. Запустите это следующим образом:


    el@apollo:/home/el/foo3$ python main.py 
    where are the nuclear wessels?

    Если вы определили другие функции в chekov.py, они будут недоступны, если вы import *


Пример 4, Импорт riaa.py если файл находится в другом расположении, чем то, откуда он был импортирован


  1. Поместите это в /home/el/foo4/stuff/riaa.py:


    def watchout():
    print "computers are transforming into a noose and a yoke for humans"

  2. Поместите это в /home/el/foo4/main.py:


    import sys 
    import os
    sys.path.append(os.path.abspath("/home/el/foo4/stuff"))
    from riaa import *
    watchout()

  3. Запустите это:


    el@apollo:/home/el/foo4$ python main.py 
    computers are transforming into a noose and a yoke for humans

    Который импортирует все, что находится во внешнем файле, из другого каталога.


Пример 5, использование os.system("python yourfile.py")

import os
os.system("python yourfile.py")

Пример 6, импортируйте ваш файл с помощью piggybacking в python startuphook:

Обновление: Раньше этот пример работал как для python2, так и для 3, но теперь работает только для python2. python3 избавился от этого набора функций пользовательского startuphook, потому что им злоупотребляли малоквалифицированные разработчики библиотек python, используя его для невежливого внедрения своего кода в глобальное пространство имен перед всеми пользовательскими программами. Если вы хотите, чтобы это работало для python3, вам придется проявить больше изобретательности. Если я расскажу вам, как это сделать, разработчики python отключат и этот набор функций, так что вы предоставлены сами себе.

Смотрите: https://docs.python.org/2/library/user.html

Поместите этот код в свой домашний каталог в ~/.pythonrc.py

class secretclass:
def secretmessage(cls, myarg):
return myarg + " is if.. up in the sky, the sky"
secretmessage = classmethod( secretmessage )

def skycake(cls):
return "cookie and sky pie people can't go up and "
skycake = classmethod( skycake )

Вставьте этот код в свой файл main.py (может быть где угодно):

import user
msg = "The only way skycake tates good"
msg = user.secretclass.secretmessage(msg)
msg += user.secretclass.skycake()
print(msg + " have the sky pie! SKYCAKE!")

Запустите его, вы должны получить это:

$ python main.py
The only way skycake tates good is if.. up in the sky,
the skycookie and sky pie people can't go up and have the sky pie!
SKYCAKE!

Если вы получаете сообщение об ошибке здесь: ModuleNotFoundError: No module named 'user' то это означает, что вы используете python3, startuphooks по умолчанию там отключены.

Заслуга в создании этого jist принадлежит: https://github.com/docwhat/homedir-examples/blob/master/python-commandline/.pythonrc.py Присылайте свои обновления.

Пример 7, наиболее надежный: импортируйте файлы на python с помощью простой команды import:


  1. Создайте новый каталог /home/el/foo5/

  2. Создайте новый каталог /home/el/foo5/herp

  3. Создайте пустой файл с именем __init__.py в herp:


    el@apollo:/home/el/foo5/herp$ touch __init__.py
    el@apollo:/home/el/foo5/herp$ ls
    __init__.py

  4. Создайте новый каталог /home/el/ foo5 /herp / derp


  5. В derp создайте другой __init__.py файл:


    el@apollo:/home/el/foo5/herp/derp$ touch __init__.py
    el@apollo:/home/el/foo5/herp/derp$ ls
    __init__.py

  6. В /home/el/ foo5/herp / derp создайте новый файл с именем yolo.py Поместите это туда:


    def skycake():
    print "SkyCake evolves to stay just beyond the cognitive reach of " +
    "the bulk of men. SKYCAKE!!"

  7. Момент истины, создайте новый файл /home/el/foo5/main.py, поместите это туда;


    from herp.derp.yolo import skycake
    skycake()

  8. Запустите это:


    el@apollo:/home/el/foo5$ python main.py
    SkyCake evolves to stay just beyond the cognitive reach of the bulk
    of men. SKYCAKE!!

    Пустой __init__.py файл сообщает интерпретатору python, что разработчик намеревается использовать этот каталог в качестве импортируемого пакета.


Если вы хотите прочитать мой пост о том, как включить ВСЕ файлы .py в каталог, смотрите здесь: https://pythonly.ru/a/20753073/445131

Ответ 2

importlib был добавлен в Python 3 для программного импорта модуля.

import importlib

moduleName = input('Enter module name:')
importlib.import_module(moduleName)

Расширение .py следует удалить из moduleName. Функция также определяет package аргумент для относительного импорта.

В python 2.x:


  • Просто import file без расширения .py

  • Папку можно пометить как пакет, добавив пустой __init__.py файл

  • Вы можете использовать __import__ функцию, которая принимает имя модуля (без расширения) в качестве расширения строки

pmName = input('Enter module name:')
pm = __import__(pmName)
print(dir(pm))

Введите help(__import__) для получения более подробной информации.

Ответ 3

Первый случай

Вы хотите импортировать файл A.py в file B.py, эти два файла находятся в одной папке, вот так:

. 
├── A.py
└── B.py

Вы можете сделать это в файле B.py:

import A

или

from A import *

или

from A import THINGS_YOU_WANT_TO_IMPORT_IN_A

Тогда вы сможете использовать все функции file A.py в file B.py


Второй случай

Вы хотите импортировать файл folder/A.py в file B.py, эти два файла не находятся в одной папке, вот так:

.
├── B.py
└── folder
└── A.py

Вы можете сделать это в файле B.py:

import folder.A

или

from folder.A import *

или

from folder.A import THINGS_YOU_WANT_TO_IMPORT_IN_A

Тогда вы сможете использовать все функции file A.py в file B.py


Краткие сведения


  • В первом случае file A.py - это модуль, который вы импортируете в file B.py, вы использовали синтаксис import module_name.

  • Во втором случае, folder это пакет, содержащий модуль A.py, вы использовали синтаксис import package_name.module_name.

Для получения дополнительной информации о пакетах и модулях обратитесь к этой ссылке.

Ответ 4

Импортировать определенный файл Python во время выполнения с известным именем:

import os
import sys

...

scriptpath = "../Test/"

# Add the directory containing your module to the Python path (wants absolute paths)
sys.path.append(os.path.abspath(scriptpath))

# Do the import
import MyModule
2023-07-16 13:58 python