Как можно импортировать модуль 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
можно использовать для остальной части сценария, как если бы это был локальный ресурс.
Отказ от ответственности: я автор этого модуля.