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

982
Tamer 28 Фев 2010 в 06:40

16 ответов

Чтобы импортировать определенный файл 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
62
James 28 Ноя 2019 в 11:29

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

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

1
Benj 22 Авг 2018 в 10:01

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

import DoStuff.py as DS
DS.main()

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

5
Luke359 9 Май 2016 в 09:01

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

1
Jonathan 29 Июл 2018 в 02:20

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

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

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

from x import greet

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

2
Sid 17 Авг 2019 в 12:11

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

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

8
Bohao LI 31 Май 2019 в 08:51

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

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

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

mydir/spam/__init__.py
mydir/spam/module.py
import spam.module
or
from spam import module
21
Sanyal 29 Ноя 2018 в 05:04

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

14
Devendra Bhat 16 Фев 2018 в 19:49

Просто для импорта файла 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
Sundar Gsv 25 Мар 2018 в 13:27

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

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

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

%load_ext autoreload 
%autoreload 2
2
rishi jain 29 Июл 2019 в 14:29

Это то, как я сделал для вызова функции из файла 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)
1
Xiao-Feng Li 28 Апр 2019 в 16:34

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

Эта запись Майка Груши является прекрасным объяснением {{X0 }} и его использование для создания, импорта и настройки пакетов Python.

7
supreme 27 Июн 2017 в 16:14

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

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

29
iwasrobbed 24 Фев 2016 в 23:02

Одна очень неизвестная особенность 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()
0
Farsheed 9 Май 2019 в 08:04

Если модуль , который вы хотите импортировать, находится не в подкаталоге , попробуйте следующее и запустите 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
Christoph Schranz 4 Дек 2018 в 14:10