Импорт модуля 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
класс загрузчика.