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

800

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

  1. Как именно я могу импортировать определенный файл Python, как import file.py?
  2. Как я могу импортировать папку вместо определенного файла?
  3. Я хочу загружать файл Python динамически во время выполнения, основываясь на пользовательском вводе.
  4. Я хочу знать, как загрузить только одну конкретную часть из файла.

Например, у main.pyменя есть:

from extra import * 

Хотя это дает мне все определения extra.py, когда, возможно, все, что я хочу, это одно определение:

def gap():
    print
    print

Что мне добавить в importутверждение, чтобы просто получить gapот extra.py?

укротитель
источник
Смотрите также: stackoverflow.com/questions/8663076/…
dreftymac

Ответы:

444

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

import importlib

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

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


Обновление: ответ ниже устарел . Используйте более свежую альтернативу выше.

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

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

  3. Вы можете использовать __import__функцию. Он принимает имя модуля в виде строки. (Опять же: имя модуля без расширения .py).

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

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

радиан
источник
7
Если вы добавите import filenameв файл init .py, вы можете импортировать модуль непосредственно как имя папки.
CornSmith
9
От help(__import__):Because this function is meant for use by the Python interpreter and not for general use it is better to use importlib.import_module() to programmatically import a module.
Tadhg McDonald-Jensen
6
Что если это не пакет, а просто файл сценария?
Джонатан
3
Для импорта файла сценария по тому же пути (возможно, он также будет работать для файла сценария в пути поиска Python), import filenamenoextу меня это отлично работает, с Python 3.4.8.
Алекс Холл
7
Это все еще точно в 2019 году? Это python3 или 2?
Сандбург
1032

Есть много способов импортировать файл 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, what_does_the_fox_say()вызвали функцию python из 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, использование из ... import ... функциональность:

  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, импортируйте ваш файл с помощью контекста python startuphook:

Обновление: этот пример раньше работал как для python2, так и для 3, но теперь работает только для python2. Python3 избавился от этого пользовательского набора функций автозапуска, потому что он использовался авторами библиотек 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, автозагрузка там отключена по умолчанию.

Кредит на этот 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__.pyherp:

    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. Под сумасшедшим, сделайте другой __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://stackoverflow.com/a/20753073/445131.

Эрик Лещинский
источник
6
Вы также должны добавить Пример 6: использование __import__(py_file_name). В любом случае, потрясающий гид
oriadam
4
Каждый раз, когда у меня возникает проблема с импортом, я сталкиваюсь с этим вопросом и всегда могу решить свою проблему. Если бы я мог высказывать это каждый раз, когда вы мне помогали, я бы сделал это.
dgBP
4
Какая большая разница между всеми этими и почему один лучше, чем любой другой? Например, 5 вы пишете «Импортировать файлы в python с помощью простой команды import», но вы также используете команду «bare?» В примерах 1, 3 и 4, не так ли?
Привет, до свидания,
34
Хороший ответ, но тот факт, что вы всегда используете другой файл импорта в качестве примера, делает его трудным для чтения.
gented
2
Я хотел бы подчеркнуть, что даже если вы работаете в Windows, импорт чувствителен к регистру. Таким образом, вы не можете иметь Module.py и иметь в своем модуле импорта
radato
66

Чтобы импортировать определенный файл 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
Джеймс
источник
Мой друг проверил это сегодня без удачи - похоже, имя файла там не должно быть. Он использовал локальный файл в родительском каталоге и в конце работал "./", как если бы родительский каталог (..). Исправление проблемы в посте было отклонено - возможно, недоразумение (?) Напечатайте sys.path и сравните записи, если вы не уверены ...
Том
29

У вас нет много сложных методов для импорта файла Python из одной папки в другую. Просто создайте файл __init__.py, чтобы объявить, что эта папка является пакетом python, а затем перейдите в файл хоста, куда вы хотите импортировать, просто введите

from root.parent.folder.file import variable, class, whatever

Фатих Каратана
источник
15
Что если я хочу относительный путь?
Домих
22

Импорт документов .. - Ссылка для справки

Эти __init__.pyфайлы необходимы , чтобы Python лечить каталоги как содержащие пакеты, это делается , чтобы предотвратить каталоги с общим названием, например, строки, непреднамеренное скрывая действительные модули , которые происходят позже на пути поиска модулей.

__init__.pyможет быть просто пустым файлом, но он также может выполнить код инициализации для пакета или установить __all__переменную.

mydir/spam/__init__.py
mydir/spam/module.py
import spam.module
or
from spam import module
Sanyal
источник
20

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

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

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

import A

или

from A import *

или

from A import THINGS_YOU_WANT_TO_IMPORT_IN_A

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


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

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

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

import folder.A

или

from folder.A import *

или

from folder.A import THINGS_YOU_WANT_TO_IMPORT_IN_A

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


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

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

Бохао Л.И.
источник
Я попробовал с небольшим изменением, и это сработало. from folder_a.script import *Script.py находится в папке.
Джастин
+1 Это то, что я искал. Не могу понять другие ответы, но вы объяснили это с помощью каталогов.
Черный Гром
Что если я хочу импортировать py-файл, который находится в родительском каталоге?
bytedev
1
@bytedev Добавьте import sysи sys.path.append("..")в начало файла. Согласно этому: stackoverflow.com/a/48341902/6057480 . Протестировано, работает отлично, после этого вы сможете импортировать py-файл в родительский каталог и все еще в состоянии импортировать py-файлы в том же каталоге и подкаталогах.
Bohao LI
17
from file import function_name  ######## Importing specific function
function_name()                 ######## Calling function

а также

import file              ######## Importing whole package
file.function1_name()    ######## Calling function
file.function2_name()    ######## Calling function

Вот два простых способа, которые я уже понял, и убедитесь, что ваш файл file.py, который вы хотите импортировать как библиотеку, присутствует только в вашем текущем каталоге.

Девендра Бхат
источник
9

Если определенная функция находится в файле x.py:

def greet():
    print('Hello! How are you?')

В файле, куда вы импортируете функцию, напишите это:

from x import greet

Это полезно, если вы не хотите импортировать все функции в файл.

Sid
источник
7

лучший способ импортировать .py файлы - это __init__.py. самое простое, что нужно сделать, это создать пустой файл с именем __init__.pyв том же каталоге, в котором находится ваш файл .py.

Этот пост Майка Гроучи - отличное объяснение __init__.pyи его использование для создания, импорта и настройки пакетов Python.

высший
источник
1
@GhostCat Я обновил свой ответ. спасибо за ссылку "было бы предпочтительнее".
высшее
И поймите, что не все живут в вашем часовом поясе.
GhostCat
4
Вы должны были опубликовать содержание поста Майка Граучи, тем более что ссылка теперь 404s. web.archive.org/web/20190309045451/https://mikegrouchy.com/blog/…
qwr
6

Как я импортирую, так это импортирую файл и использую сокращение его имени.

import DoStuff.py as DS
DS.main()

Не забывайте, что ваш импортируемый файл ДОЛЖЕН БЫТЬ назван с расширением .py

Luke359
источник
3
Не import DoStuff.py as DSпытался бы импортировать pyиз DoStuff?
Benj
5

Я хотел бы добавить эту заметку, я не очень четко в другом месте; внутри модуля / пакета при загрузке из файлов перед именем модуля / пакета должен стоять префикс mymodule. Представьте, mymoduleчто вы так устроены:

/main.py
/mymodule
    /__init__.py
    /somefile.py
    /otherstuff.py

При загрузке somefile.py/ otherstuff.pyиз __init__.pyсодержимого должно выглядеть так:

from mymodule.somefile import somefunc
from mymodule.otherstuff import otherfunc
Свен
источник
2

Если модуль, который вы хотите импортировать, не находится в подкаталоге , попробуйте следующее и запустите app.pyиз самого глубокого общего родительского каталога:

Структура каталогов:

/path/to/common_dir/module/file.py
/path/to/common_dir/application/app.py
/path/to/common_dir/application/subpath/config.json

В app.py, добавьте путь клиента к sys.path:

import os, sys, inspect

sys.path.append(os.getcwd())
from module.file import MyClass
instance = MyClass()

Необязательно (если вы загружаете, например, конфиги) (Inspect представляется наиболее надежным для моих случаев использования)

# Get dirname from inspect module
filename = inspect.getframeinfo(inspect.currentframe()).filename
dirname = os.path.dirname(os.path.abspath(filename))
MY_CONFIG = os.path.join(dirname, "subpath/config.json")

Запустить

user@host:/path/to/common_dir$ python3 application/app.py

Это решение работает для меня в Cli, а также PyCharm.

Кристоф Шранц
источник
2

Есть несколько способов включить ваш скрипт на python с именем abc.py

  1. например, если ваш файл называется abc.py (import abc). Ограничение заключается в том, что ваш файл должен присутствовать в том же месте, где находится ваш вызывающий скрипт python.

импорт abc

  1. например, если ваш файл python находится в папке Windows. Папка Windows находится в том же месте, где находится ваш вызывающий скрипт Python.

из папки импорта abc

  1. Включите скрипт abc.py, который можно найти в папке internal_folder, которая находится внутри папки

из папки .internal_folder импортировать abc

  1. Как ответил Джеймс выше, в случае, если ваш файл находится в каком-то фиксированном месте

import os
import sys
scriptpath = "../Test/MyModule.py"
sys.path.append (os.path.abspath (scriptpath))
импорт MyModule

Если ваш скрипт на Python обновляется и вы не хотите загружать - используйте эти операторы для автоматического обновления. Бонус :)

%load_ext autoreload 
%autoreload 2
Риши Джайн
источник
1

Просто для импорта файла Python в другой файл Python

скажем, у меня есть файл python helper.py, который имеет функцию отображения, как,

def display():
    print("I'm working sundar gsv")

Теперь в app.py вы можете использовать функцию отображения,

import helper
helper.display()

Выход,

I'm working sundar gsv

ПРИМЕЧАНИЕ. Нет необходимости указывать расширение .py.

Сундар Гсв
источник
1

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

Джонатан
источник
1

Вы также можете сделать это: from filename import something

пример: from client import Client обратите внимание, что вам не нужно .py .pyw .pyuiрасширение.

Лукас Соареш
источник
1

Это то, как я сделал для вызова функции из файла Python, что позволяет мне вызывать любые функции.

import os, importlib, sys

def callfunc(myfile, myfunc, *args):
    pathname, filename = os.path.split(myfile)
    sys.path.append(os.path.abspath(pathname))
    modname = os.path.splitext(filename)[0]
    mymod = importlib.import_module(modname)
    result = getattr(mymod, myfunc)(*args)
    return result

result = callfunc("pathto/myfile.py", "myfunc", arg1, arg2)
Сяо-Фенг Ли
источник
Как сделать новую функцию лучше, чем использовать ее напрямую?
qwr
@qwr Новая функция callfunc () - это просто оболочка кода для динамического вызова целевой функции в файле python. В качестве примера приводится цель «myfunc» в файле Python «pathto / myfile.py». Что вы подразумеваете под «непосредственным использованием функции»?
Сяо-Фенг Ли
Работал отлично для меня. В моем примере я заменил: from mypath import Pathс Path = callfunc("/folder/to/mypath.py", "Path"). Спасибо @ Xiao-FengLi
user319436
@ user319436 Рад, что мой ответ наконец-то кому-то поможет. :)
Сяо-Фенг Ли
Спасибо @ сяо-фэн-ли! Отличный ответ !!
Альтьерес де Матос
0

Есть много способов, как указано выше, но я обнаружил, что я просто хочу импортировать содержимое файла и не хочу писать строки и строки и импортировать другие модули. Итак, я нашел способ получить содержимое файла, даже с точечным синтаксисом ( file.property), а не объединять импортированный файл с вашим.
Прежде всего, вот мой файл, который я импортирую,data.py

    testString= "A string literal to import and test with"


Примечание..txt Вместо этого вы можете использовать расширение.
В mainfile.py, начнут с открытием и получением содержимого.

    #!usr/bin/env python3
    Data=open('data.txt','r+').read()

Теперь у вас есть содержимое в виде строки, но попытка доступа data.testStringвызовет ошибку, как dataи экземпляр strкласса, и даже если у него есть свойство, testStringоно не будет делать то, что вы ожидали.
Далее создайте класс. Например (каламбур предназначен),ImportedFile

    class ImportedFile:

И поместите это в это (с соответствующим отступом):

    exec(data)


И, наконец, переназначить dataтак:

    data=ImportedFile()

И это все! Просто получите доступ, как если бы вы работали с любым другим модулем, набрав, print(data.testString)вы напечатаете на консоли A string literal to import and test with.
Однако, если вы хотите получить эквивалент, from mod import *просто отбросьте класс, присвойте экземпляр и отмените определение exec.

Надеюсь, это поможет :)
-Бенджи

Benj
источник
Вы серьезно думаете, что чтение содержимого файла в виде строки и последующее его выполнение - хорошее решение, когда у нас есть все другие решения, которые опубликовали люди?
qwr
@ qwr Да, конечно. Многие другие ответы не работают в некоторых ситуациях. Вот почему мне нужен был простой способ, который гарантированно работал. Если вы неспособны видеть вещи с другой точки зрения, вам нужно попробовать использовать официальный IDLE.
Бендж
0

Одна очень неизвестная особенность Python - это возможность импортировать zipфайлы:

library.zip
|-library
|--__init__.py

Файл __init__.pyпакета содержит следующее:

def dummy():
    print 'Testing things out...'

Мы можем написать другой скрипт, который может импортировать пакет из zip-архива. Нужно только добавить zip-файл в sys.path.

import sys
sys.path.append(r'library.zip')

import library

def run():
    library.dummy()

run()
Farsheed
источник
какое преимущество дает файл zip?
qwr