2015-02-03 13 views
11

Jako eksperyment chcę zobaczyć, jak zaimportować moduł Pythona z adresu URL. Hipotetycznym celem byłoby zaimportowanie z centralnej lokalizacji, która aktualizuje moduły. Jak można to zrobić?W jaki sposób można importować moduł Python z adresu URL?

Moja próba jest następujący:

>>> 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 zidentyfikowali poprawkę przykładowym kodzie, który prowadzi reprezentację ciąg modułu zdalnego. Wynikowy kod jest następujący:

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

Naprawdę nie powinieneś. Nie ładuj kodu przez Internet i nie uruchamiaj go, chyba że chcesz zostać zhackowany. Powiedział, że jedynym błędem nie jest wywoływanie '.read()' w wyniku 'urlopen()'. –

+2

Zamiast ładować z adresu URL, użyj systemu kontroli wersji (git, mercurial itp.), Aby zachować aktualność kodu. –

+0

[Martijn Pieters] (http://stackoverflow.com/users/100297/martijn-pieters) Dzięki za twoje komentarze tam i za wykrywanie problemu '' 'read()' ''. W ten sposób powstaje ciąg znaków, który można wykonać. Jestem świadomy problemów związanych z bezpieczeństwem; jest to tylko do celów eksperymentalnych. Czy wiesz, czy jest jakiś wysiłek, aby zapewnić bezpieczniejsze podejście do tego pomysłu? – d3pd

Odpowiedz

1

Tak, można.

Wystarczy pobrać moduł z adresem URL, a gdy już jest przechowywać go jako ciąg znaków, gdzie można go uruchomić przy użyciu eval()

Korzystanie urllib i eval można to zrobić w prosty sposób:

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

Do zauważ, że niektóre moduły (takie jak Pygame i Pydub) wymagają środowisk wykonawczych i nie można ich uruchomić przy użyciu eval() z powodu brakujących środowisk wykonawczych.

Życzymy powodzenia w projekcie, mam nadzieję, że pomogłem.

Powiązane problemy