Как мне импортировать другие файлы Python?
Как мне импортировать файлы в Python? Я хочу импортировать:
- файл (например,
file.py
) - папка
- файл создается динамически во время выполнения на основе ввода пользователем
- одна определенная часть файла (например, отдельная функция)
Переведено автоматически
Ответ 1
Существует множество способов импортировать файл python, у каждого из которых есть свои плюсы и минусы.
Не выбирайте поспешно первую стратегию импорта, которая подходит именно вам, иначе вам придется переписывать кодовую базу позже, когда вы обнаружите, что она не соответствует вашим потребностям.
Я начну с объяснения самого простого примера № 1, затем перейду к наиболее профессиональному и надежному примеру № 7
Пример 1, Импортируйте модуль python с помощью интерпретатора python:
Поместите это в /home/el/foo/fox.py:
def what_does_the_fox_say():
print("vixens cry")Получить доступ к интерпретатору 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 на месте:
Поместите это в /home/el/foo2/mylib.py:
def moobar():
print("hi")Поместите это в /home/el/foo2/main.py:
execfile("/home/el/foo2/mylib.py")
moobar()запустите файл:
el@apollo:/home/el/foo$ python main.py
hiФункция moobar была импортирована из mylib.py и стала доступной в main.py
Пример 3, использование from ... импорт ... функциональность:
Поместите это в /home/el/foo3/chekov.py:
def question():
print "where are the nuclear wessels?"Поместите это в /home/el/foo3/main.py:
from chekov import question
question()Запустите это следующим образом:
el@apollo:/home/el/foo3$ python main.py
where are the nuclear wessels?Если вы определили другие функции в chekov.py, они будут недоступны, если вы
import *
Пример 4, Импорт riaa.py если файл находится в другом расположении, чем то, откуда он был импортирован
Поместите это в /home/el/foo4/stuff/riaa.py:
def watchout():
print "computers are transforming into a noose and a yoke for humans"Поместите это в /home/el/foo4/main.py:
import sys
import os
sys.path.append(os.path.abspath("/home/el/foo4/stuff"))
from riaa import *
watchout()Запустите это:
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 startuphook:
Обновление: Раньше этот пример работал как для python2, так и для 3, но теперь работает только для python2. python3 избавился от этого набора функций пользовательского startuphook, потому что им злоупотребляли малоквалифицированные разработчики библиотек 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, startuphooks по умолчанию там отключены.
Заслуга в создании этого jist принадлежит: https://github.com/docwhat/homedir-examples/blob/master/python-commandline/.pythonrc.py Присылайте свои обновления.
Пример 7, наиболее надежный: импортируйте файлы на python с помощью простой команды import:
- Создайте новый каталог
/home/el/foo5/
- Создайте новый каталог
/home/el/foo5/herp
Создайте пустой файл с именем
__init__.py
в herp:el@apollo:/home/el/foo5/herp$ touch __init__.py
el@apollo:/home/el/foo5/herp$ ls
__init__.pyСоздайте новый каталог /home/el/ foo5 /herp / derp
В derp создайте другой
__init__.py
файл:el@apollo:/home/el/foo5/herp/derp$ touch __init__.py
el@apollo:/home/el/foo5/herp/derp$ ls
__init__.pyВ /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!!"Момент истины, создайте новый файл
/home/el/foo5/main.py
, поместите это туда;from herp.derp.yolo import skycake
skycake()Запустите это:
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://pythonly.ru/a/20753073/445131
Ответ 2
importlib
был добавлен в Python 3 для программного импорта модуля.
import importlib
moduleName = input('Enter module name:')
importlib.import_module(moduleName)
Расширение .py следует удалить из moduleName
. Функция также определяет package
аргумент для относительного импорта.
В python 2.x:
- Просто
import file
без расширения .py - Папку можно пометить как пакет, добавив пустой
__init__.py
файл - Вы можете использовать
__import__
функцию, которая принимает имя модуля (без расширения) в качестве расширения строки
pmName = input('Enter module name:')
pm = __import__(pmName)
print(dir(pm))
Введите help(__import__)
для получения более подробной информации.
Ответ 3
Первый случай
Вы хотите импортировать файл A.py
в file B.py
, эти два файла находятся в одной папке, вот так:
.
├── A.py
└── B.py
Вы можете сделать это в файле B.py
:
import A
или
from A import *
или
from A import THINGS_YOU_WANT_TO_IMPORT_IN_A
Тогда вы сможете использовать все функции file A.py
в file B.py
Второй случай
Вы хотите импортировать файл folder/A.py
в file B.py
, эти два файла не находятся в одной папке, вот так:
.
├── B.py
└── folder
└── A.py
Вы можете сделать это в файле B.py
:
import folder.A
или
from folder.A import *
или
from folder.A import THINGS_YOU_WANT_TO_IMPORT_IN_A
Тогда вы сможете использовать все функции file A.py
в file B.py
Краткие сведения
- В первом случае file
A.py
- это модуль, который вы импортируете в fileB.py
, вы использовали синтаксисimport module_name
. - Во втором случае,
folder
это пакет, содержащий модульA.py
, вы использовали синтаксисimport package_name.module_name
.
Для получения дополнительной информации о пакетах и модулях обратитесь к этой ссылке.
Ответ 4
Импортировать определенный файл 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