Так круто! ! Я могу указать восемь методов в Python, а вы?

Python

Впервые опубликовано в общедоступном аккаунте 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 очень нужен.