Как импортировать другие файлы Python? - PullRequest
633 голосов
/ 28 февраля 2010

Как мне импортировать другие файлы в 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?

Ответы [ 17 ]

858 голосов
/ 23 декабря 2013

Есть много способов импортировать файл 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, Использование из ... 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:

Обновление: Этот пример раньше работал как для 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 с помощью простой команды импорта:

  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

366 голосов
/ 28 февраля 2010

importlib - это недавнее добавление в Python для программного импорта модуля. Это просто обёртка вокруг __import__ Смотри https://docs.python.org/3/library/importlib.html#module-importlib

import importlib

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

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

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

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

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

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

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

51 голосов
/ 30 апреля 2013

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

import os
import sys

...

scriptpath = "../Test/MyModule.py"

# 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
26 голосов
/ 24 января 2013

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

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

17 голосов
/ 02 октября 2015

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

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

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

mydir/spam/__init__.py
mydir/spam/module.py
import spam.module
or
from spam import module
12 голосов
/ 09 февраля 2018
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», который вы хотите импортировать как библиотеку, присутствует только в вашем текущем каталоге.

5 голосов
/ 27 июня 2017

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

this post от Mike Grouchy - отличное объяснение __init__.py и его использования для создания, импорта и настройки пакетов python.

4 голосов
/ 09 мая 2016

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

import DoStuff.py as DS
DS.main()

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

4 голосов
/ 18 апреля 2018

Я хотел бы добавить эту заметку, я не очень четко в другом месте; внутри модуля / пакета при загрузке из файлов перед именем модуля / пакета должен стоять префикс 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
3 голосов
/ 15 мая 2019

Первый случай: вы хотите импортировать файл 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.

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

...