Впервые опубликовано в общедоступном аккаунте WeChat: «Время программирования на Python». Оригинальная ссылка:Tickets.WeChat.QQ.com/Yes/7F4 Friends d VOB…
Сегодня я познакомлю вас с восемью методами руководства по пакетам Python, которые я использовал.
1. Прямой импорт
Известный метод, вы можете напрямую импортировать
>>> import os
>>> os.getcwd()
'/home/wangbm'
Подобно этому, мы не будем подробно
import ...
import ... as ...
from ... import ...
from ... import ... as ...
В общем, используйтеimport
Достаточно модуля импорта выписок.
Но в некоторых особых случаях могут потребоваться другие методы импорта.
Ниже я представлю их вам один за другим.
2. Используйте _import_
__import__
Функции можно использовать для импорта модулей, а операторы импорта также вызывают функции. Он определяется как:
__import__(name[, globals[, locals[, fromlist[, level]]]])
Введение параметра:
- name (обязательно): имя загруженного модуля
- globals (необязательный): словарь, содержащий глобальные переменные, этот параметр используется редко, значение по умолчанию global()
- locals (необязательно): словарь, содержащий локальные переменные, которые не используются внутренней стандартной реализацией, значения по умолчанию — local()
- fromlist (необязательно): имя импортируемого подмодуля
- уровень (необязательно): параметр пути импорта, по умолчанию в Python 2 -1, что означает, что поддерживается как абсолютный, так и относительный импорт. По умолчанию в Python 3 установлено значение 0, что означает, что поддерживается только абсолютный импорт. Если больше 0, это указывает на уровень относительного импортированного родительского каталога, т.е. 1 соответствует '.', 2 соответствует '..'.
Пример использования следующий:
>>> os = __import__('os')
>>> os.getcwd()
'/home/wangbm'
Если вы хотите достичьimport xx as yy
эффект, просто измените lvalue
Следующий пример эквивалентенimport os as myos
:
>>> myos = __import__('os')
>>> myos.getcwd()
'/home/wangbm'
сказано выше__import__
является встроенной функцией, так как это встроенная функция, то эта встроенная функция должна существовать в__buildins__
, поэтому мы также можем импортировать модуль os следующим образом:
>>> __builtins__.__dict__['__import__']('os').getcwd()
'/home/wangbm'
3. Использование модуля importlib
importlib — это стандартная библиотека Python, и функции, предоставляемые importlib, очень обширны.
Простой пример этого:
>>> import importlib
>>> myos=importlib.import_module("os")
>>> myos.getcwd()
'/home/wangbm'
Если вы хотите достичьimport xx as yy
эффект, так
>>> import importlib
>>>
>>> myos = importlib.import_module("os")
>>> myos.getcwd()
'/home/wangbm'
4. Использование модуля имп
imp
Модули предоставляют некоторые интерфейсы, реализованные внутри операторов импорта. Например, поиск модуля (find_module), загрузка модуля (load_module) и т. д. (процесс импорта модуля будет включать такие шаги, как поиск модуля, загрузка и кэширование). Вы можете использовать этот модуль, чтобы просто реализовать встроенный__import__
Функция функции:
>>> import imp
>>> file, pathname, desc = imp.find_module('os')
>>> myos = imp.load_module('sep', file, pathname, desc)
>>> myos
<module 'sep' from '/usr/lib64/python2.7/os.pyc'>
>>> myos.getcwd()
'/home/wangbm'
Начиная с Python 3, встроенная функция перезагрузки была перенесена в модуль imp. Начиная с Python 3.4, модуль imp устарел и больше не рекомендуется, а содержащиеся в нем функции были перемещены в модуль importlib. То есть, начиная с Python 3.4, модуль importlib представляет собой комбинацию предыдущего модуля imp и модуля importlib.
5. Использование исполняемого файла
В Python 2 есть функция execfile, которую можно использовать для выполнения файла.
Синтаксис следующий:
execfile(filename[, globals[, locals]])
Параметры следующие:
- имя файла: имя файла.
- globals: переменная область действия, глобальное пространство имен, если оно предоставлено, должно быть объектом словаря.
- locals: переменная область видимости, локальное пространство имен, если оно предоставлено, может быть любым объектом карты.
>>> execfile("/usr/lib64/python2.7/os.py")
>>>
>>> getcwd()
'/home/wangbm'
6. Выполнить с помощью exec
execfile
Доступная только в Python2, эта функция была удалена в Python 3.x.
Но принцип стоит изучить, вы можете использовать open ... read для чтения содержимого файла, а затем использовать exec для выполнения модуля.
Пример выглядит следующим образом:
>>> with open("/usr/lib64/python2.7/os.py", "r") as f:
... exec(f.read())
...
>>> getcwd()
'/home/wangbm'
7. import_from_github_com
Есть пакет под названиемimport_from_github_com, что легко понять из названия, это пакет, который можно скачать, установить и импортировать с github. Чтобы использовать его, все, что вам нужно сделать, это сначала установить его с помощью pip следующим образом.
$ python3 -m pip install import_from_github_com
Этот пакет использует новый хук импорта в PEP 302, позволяющий импортировать пакеты из github. На самом деле этот пакет устанавливает пакет и добавляет его локально. Для использования этого пакета вам потребуется Python 3.2 или выше с установленными git и pip.
pip должен быть более новой версии, если нет, выполните следующую команду для обновления.
$ python3 -m pip install --upgrade pip
Убедившись, что среда в порядке, вы можете использовать import_from_github_com в оболочке Python.
Примеры следующие
>>> from github_com.zzzeek import sqlalchemy
Collecting git+https://github.com/zzzeek/sqlalchemy
Cloning https://github.com/zzzeek/sqlalchemy to /tmp/pip-acfv7t06-build
Installing collected packages: SQLAlchemy
Running setup.py install for SQLAlchemy ... done
Successfully installed SQLAlchemy-1.1.0b1.dev0
>>> locals()
{'__builtins__': <module 'builtins' (built-in)>, '__spec__': None,
'__package__': None, '__doc__': None, '__name__': '__main__',
'sqlalchemy': <module 'sqlalchemy' from '/usr/local/lib/python3.5/site-packages/\
sqlalchemy/__init__.py'>,
'__loader__': <class '_frozen_importlib.BuiltinImporter'>}
>>>
Посмотрев исходный код import_from_github_com, вы заметите, что он не использует importlib. На самом деле его принцип заключается в том, чтобы использовать pip для установки тех пакетов, которые не установлены, а затем использовать__import__()
функция для импорта недавно установленных модулей.
8. Модуль удаленного импорта
В этой статье (Глубокое погружение в механизм импорта Python: реализация модулей удаленного импорта), глубоко проанализировал внутренние принципы импорта модулей и, наконец, вручную реализовал импортер, который считывает содержимое модуля с удаленного сервера и успешно импортирует модуль локально.
Существует много конкретного контента, вы можете нажать на этоСвязьЗаймитесь глубоким обучением.
Пример кода выглядит следующим образом:
# 新建一个 py 文件(my_importer.py),内容如下
import sys
import importlib
import urllib.request as urllib2
class UrlMetaFinder(importlib.abc.MetaPathFinder):
def __init__(self, baseurl):
self._baseurl = baseurl
def find_module(self, fullname, path=None):
if path is None:
baseurl = self._baseurl
else:
# 不是原定义的url就直接返回不存在
if not path.startswith(self._baseurl):
return None
baseurl = path
try:
loader = UrlMetaLoader(baseurl)
return loader
except Exception:
return None
class UrlMetaLoader(importlib.abc.SourceLoader):
def __init__(self, baseurl):
self.baseurl = baseurl
def get_code(self, fullname):
f = urllib2.urlopen(self.get_filename(fullname))
return f.read()
def get_data(self):
pass
def get_filename(self, fullname):
return self.baseurl + fullname + '.py'
def install_meta(address):
finder = UrlMetaFinder(address)
sys.meta_path.append(finder)
И запустите службу http на удаленном сервере (для удобства я только демонстрирую локально), и вручную отредактируйте файл python с именем my_info, если последующий импорт будет успешным, он будет напечатанok
.
$ mkdir httpserver && cd httpserver
$ cat>my_info.py<EOF
name='wangbm'
print('ok')
EOF
$ cat my_info.py
name='wangbm'
print('ok')
$
$ python3 -m http.server 12800
Serving HTTP on 0.0.0.0 port 12800 (http://0.0.0.0:12800/) ...
...
Все готово, начинается проверка.
>>> from my_importer import install_meta
>>> install_meta('http://localhost:12800/') # 往 sys.meta_path 注册 finder
>>> import my_info # 打印ok,说明导入成功
ok
>>> my_info.name # 验证可以取得到变量
'wangbm'
Что ж, все 8 методов вам познакомили.Обычным разработчикам достаточно освоить метод импорта.Для тех, кто хочет разрабатывать свои собственные фреймворки, нужно углубленно изучить.__import__
и importlib очень нужен.