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

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

Ответ 1

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

import importlib

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

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

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

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

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

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

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

Ответ 2

Есть много способов импортировать файл Python, все со своими плюсами и минусами.

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

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

Пример 1. Импорт модуля python с интерпретатором python:

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

    def what_does_the_fox_say():
      print("vixens cry")
    
  2. Получить в интерпретатор Python:

    [email protected]:/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. запустите файл:

    [email protected]:/home/el/foo$ python main.py
    hi
    

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

Пример 3. Функциональность from... 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. Запустите это так:

    [email protected]:/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. Запустите его:

    [email protected]:/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:

    [email protected]:/home/el/foo5/herp$ touch __init__.py
    [email protected]:/home/el/foo5/herp$ ls
    __init__.py
    
  4. Создайте новый каталог /home/el/foo5/herp/derp

  5. В разделе "Сумасшедший" создайте еще один файл __init__.py:

    [email protected]:/home/el/foo5/herp/derp$ touch __init__.py
    [email protected]:/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. Запустите его:

    [email protected]:/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 в каталог, смотрите здесь: fooobar.com/questions/18957/...

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

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

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

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

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

Ответ 6

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", который вы хотите импортировать в качестве библиотеки, присутствует только в вашем текущем каталоге.

Ответ 7

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

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

Ответ 8

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

import DoStuff.py as DS
DS.main()

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

Ответ 9

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

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

Ответ 10

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

Ответ 11

Просто для импорта файла 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.

Ответ 12

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

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

Ответ 13

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

Ответ 14

Если модуль, который вы хотите импортировать, не находится в подкаталоге, попробуйте выполнить следующее и запустите 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()

Необязательно (если вы загружаете, например, configs) (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")

Бежать

[email protected]:/path/to/common_dir$ python3 application/app.py

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

Ответ 15

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

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

импорт abc

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

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

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

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

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

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

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

%load_ext autoreload 
%autoreload 2

Ответ 16

Есть много способов, как указано выше, но я считаю, что я просто хочу импортировать содержимое этого файла и не хочу писать строки и строки и им нужно импортировать другие модули. Итак, я придумал способ получить содержимое файла, даже с синтаксисом точки (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.

Надеюсь это поможет:)
-Benji

Ответ 17

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

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

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

from x import greet

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

Ответ 18

Это то, как я сделал для вызова функции из файла 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)

Ответ 19

Одна очень неизвестная особенность 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()