Как можно импортировать модуль Python из URL-адреса?

В качестве эксперимента я хочу посмотреть, как импортировать модуль Python из URL-адреса. Гипотетическая цель здесь состояла в том, чтобы импортировать из центрального местоположения, которое обновляет модули. Как это можно сделать?

Моя попытка следующая:

>>> import urllib
>>> 
>>> def import_URL(URL):
...     exec urllib.urlopen(URL) in globals()
... 
>>> import_URL("https://cdn.rawgit.com/wdbm/shijian/master/shijian.py")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in import_URL
TypeError: exec: arg 1 must be a string, file, or code object

EDIT: Martijn Pieters определил исправление для кода примера, которое приводит к строковому представлению удаленного модуля. Полученный код выглядит следующим образом:

import urllib
def import_URL(URL):
    exec urllib.urlopen(URL).read() in globals()

Ответ 1

Да, вы можете.

Просто введите модуль с URL-адресом, и как только вы сохраните его в виде строки, где вы можете запустить ее, используя eval()

Используя urllib и eval, это можно сделать легко:

import urllib.request
a = urllib.request.urlopen(url)
eval(a.read())

Обратите внимание, что некоторые модули (такие как Pygame и Pydub) требуют времени выполнения, и они не могут быть запущены с помощью eval() из-за отсутствия времени выполнения.

Удачи вам в вашем проекте, надеюсь, я помог.

Ответ 2

По сути, для этой цели существует модуль, который называется httpimport. В настоящее время поддерживается импорт из URL-адреса, содержащего пакет/модуль, а также из архивов (.tar. *,.Zip), которые можно найти в URL-адресах (это способ обработки удаленных зависимостей).

Он полностью интегрирован с системой импорта Python, поэтому вам не нужно ничего exec in globals(). Вы просто:

>>> with httpimport.remote_repo(['package1'], 'http://my-codes.example.com/python_packages'):
...     import package1
...

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


Отказ от ответственности: я автор этого модуля.