Импорт модуля Python через Интернет / несколько протоколов или динамическое создание модуля

Это возможно import модуль Python через Интернет, используя http(s), ftp, smb или любой другой протокол? Если так, то как? Если нет, то почему?

Я предполагаю, что речь идет о том, чтобы заставить Python использовать больше одного протокола (чтение файловой системы) и позволить ему использовать и другие. Да, я согласен, что это будет во много раз медленнее, но некоторая оптимизация и большая пропускная способность в будущем наверняка уравновесят это.

Например:

import site

site.addsitedir("https://bitbucket.org/zzzeek/sqlalchemy/src/e8167548429b9d4937caaa09740ffe9bdab1ef61/lib")

import sqlalchemy
import sqlalchemy.engine

4 ответа

Другая версия,

Мне нравится этот ответ. при применении я немного упростила - похоже на внешний вид javascript включает в себя через HTTP.

Это результат:

import os
import imp
import requests

def import_cdn(uri, name=None):
    if not name:
        name = os.path.basename(uri).lower().rstrip('.py')

    r = requests.get(uri)
    r.raise_for_status()

    codeobj = compile(r.content, uri, 'exec')
    module = imp.new_module(name)
    exec (codeobj, module.__dict__)
    return module

Использование:

redisdl = import_cdn("https://raw.githubusercontent.com/p/redis-dump-load/master/redisdl.py")

# Regular usage of the dynamic included library
json_text = redisdl.dumps(host='127.0.0.1')
  • Совет - поместите import_cdn функция в общей библиотеке, так что вы могли бы повторно использовать эту маленькую функцию
  • Имейте в виду, что это не удастся, когда нет подключения к этому файлу через http

В принципе, да, но все встроенные инструменты, которые поддерживают это, проходят через файловую систему.

Для этого вам нужно будет загрузить исходный код откуда угодно, скомпилировать его с compile, а также exec это с __dict__ нового модуля. Увидеть ниже.

Я оставил фактическое получение текста из Интернета и анализ Uris и т. Д. В качестве упражнения для читателя (для начинающих: я предлагаю использовать requests)

В терминах Пеп 302 это будет реализация loader.load_module функция (параметры разные). Смотрите этот документ для деталей о том, как интегрировать это с import заявление.

import imp
modulesource = 'a=1;b=2' #load from internet or wherever
def makemodule(modulesource,sourcestr='http://some/url/or/whatever',modname=None):
    #if loading from the internet, you'd probably want to parse the uri, 
    # and use the last part as the modulename. It'll come up in tracebacks
    # and the like.
    if not modname: modname = 'newmodulename'
    #must be exec mode
    # every module needs a source to be identified, can be any value
    # but if loading from the internet, you'd use the URI
    codeobj = compile(modulesource, sourcestr, 'exec')
    newmodule = imp.new_module(modname)
    exec(codeobj,newmodule.__dict__)
    return newmodule
newmodule = makemodule(modulesource)
print(newmodule.a)

С этой точки зрения newmodule это уже объект модуля в области видимости, поэтому вам не нужно импортировать его или что-либо еще.

modulesource = '''
a = 'foo'
def myfun(astr):
    return a + astr
'''
newmod = makemodule(modulesource)
print(newmod.myfun('bat'))

Идео здесь: http://ideone.com/dXGziO

Протестировано с python 2, должно работать с python 3 (используется текстовая совместимая печать; используется функциональный синтаксис exec).

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

По сути, вам придется предоставить объект поиска, который, в свою очередь, предоставляет объект загрузчика. Я не понимаю процесс с первого взгляда (в противном случае я бы сказал более подробно), но в PEP есть все необходимые детали для реализации этого материала.

Взгляните на: [ https://github.com/Asmeble/Languages/raw/Documentation-of-5/13/2018-%22What-you-think-is-left-for-indifference-has-yet-to-shape-or-be-shaped%22/Python3.6/URL_import.py%5D Я использую его для импорта кода из моего github для разработки проектов в других местах.

Хотя это было бы полезно для разработчиков игр или дизайнеров веб-приложений, обновление базы кода не займет много времени, даже для установки или демонтажа.

Как glglgl, этот перехватчик импорта был реализован для Python2 и Python3 в модуле с именем httpimport. Он использует настраиваемый объект поиска / загрузчика для поиска ресурсов с помощью HTTP/S.

Кроме того, import_cdnфункция в Jossef Harush почти идентично реализована вhttpimportс github_repo, а также bitbucket_repo функции.

Ответ @Marcin содержит большую часть кода httpimportкласс загрузчика.

Другие вопросы по тегам