Як імпортувати інші файли Python?


798

Як імпортувати інші файли в 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?


Відповіді:


443

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?
Сандберг

1030

Існує багато способів імпорту файлу python, все з їх плюсами та мінусами.

Не просто поспіхом вибирайте першу стратегію імпорту, яка працює для вас, інакше доведеться переписувати кодову базу пізніше, коли виявите, що вона не відповідає вашим потребам.

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

Приклад 1: Імпорт модуля python з інтерпретатором python:

  1. Помістіть це в /home/el/foo/fox.py:

    def what_does_the_fox_say():
      print("vixens cry")
  2. Потрапте в інтерпретатора пітона:

    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, Використовуйте з ... імпорту ... функціональності:

  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:

Оновлення: Цей приклад працював як для 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, запуск замовчувань там відключений за замовчуванням.

Заслуга за цей джист посилається на адресу: 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. Під дерпом зробіть інший __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, чи не так?
HelloGoodbye

34
Хороша відповідь, але той факт, що ви використовуєте інший файл імпорту як приклад постійно, робить його громіздким для читання.
позначено

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


14
Що робити, якщо я хочу відносний шлях?
domih

21

Імпорт док .. - Посилання для довідок

Ці __init__.pyфайли необхідні , щоб Python лікувати каталоги як містять пакети, це робиться , щоб запобігти каталоги з загальною назвою, наприклад, рядки, ненавмисне приховуючи дійсні модулі , які відбуваються пізніше на шляху пошуку модулів.

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

mydir/spam/__init__.py
mydir/spam/module.py
import spam.module
or
from spam import module

19

Перший випадок: ви хочете імпортувати файл 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 знаходиться під папкою a.
Джастін

+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

Це корисно, якщо ви не бажаєте імпортувати всі функції у файл.


7

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

Цей пост Майка Груші - це чудове пояснення __init__.pyта його використання для виготовлення, імпорту та налаштування пакунків python.


1
@GhostCat Я оновив свою відповідь. дякую за посилання "було б краще".
верховний

І розумійте, що не всі живуть у вашому часовому поясі.
GhostCat

4
Ви повинні були розмістити вміст публікації Майка Груші, тим більше, що посилання зараз 404. web.archive.org/web/20190309045451/https://mikegrouchy.com/blog/…
qwr

6

Як я імпортую, імпортуйте файл та використовуйте скорочення його імені.

import DoStuff.py as DS
DS.main()

Не забувайте, що ваш файл-імпортер ПОВИНЕН бути названий з розширенням .py


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()

Необов’язково (якщо ви завантажуєте, наприклад, конфігурації) (перевірити, здається, найбільш надійний для моїх випадків використання)

# 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.

імпорт абс

  1. наприклад, якщо ваш файл python знаходиться в папці Windows. Папка Windows присутня в тому самому місці, де знаходиться ваш скрипт виклику python.

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

  1. Скрипт Incase abc.py доступний у внутрішній теці, яка присутня всередині папки

з folder.internal_folder import 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

скажемо, у мене є файл helper.py python, який має функцію відображення, наприклад,

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 Радий, що моя відповідь допомагає комусь нарешті. :)
Сяо-Фен Лі Ли

Дякую @ xiao-feng-li !! Чудова відповідь !!
Altieres de Matos

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 *просто скинути клас, присвоєння екземпляра та де-dent exec.

Сподіваюся, це допомагає :)
-Бенджі


Ви серйозно думаєте, що читати вміст файлу як рядок, а потім виконувати його - це гарне рішення, коли у нас є всі інші рішення, які люди розмістили?
qwr

@qwr Erm так, я. Багато інших відповідей не спрацьовують у деяких ситуаціях. Ось чому мені потрібен був простий спосіб, який гарантовано працював. Якщо ви не можете бачити речі з іншого погляду, вам потрібно спробувати використовувати офіційний IDLE.
Benj

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()

яку перевагу надає zip-файл?
qwr
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.