six è un pacchetto che aiuta nel codice scrittura che è compatibile sia con Python 2 e Python 3.
Uno dei problemi sviluppatori incontrano quando si scrive codice per python2 e 3 è che i nomi di diversi moduli dalla le librerie standard sono cambiate, anche se la funzionalità rimane la stessa.
Il modulo six.moves
fornisce quei moduli sotto un nome comune per entrambi Python2 e 3 (principalmente fornendo il modulo Python2 sotto il nome del modulo Python 3).
Quindi la vostra linea
from six.moves import urllib
importazioni urllib
quando eseguito con python3 e importa una miscela di urllib
, urllib2
e urlparse
con python2, imitando la struttura del python3 di urllib
. Vedi anche here.
EDIT per affrontare l'aggiornamento della domanda:
TLDR; In questo caso non esiste necessariamente una relazione diretta tra il modulo importato urllib
e un file sul filesystem. Il file pertinente è esattamente ciò che indica six.__file__
.
I moduli di terze parti sono definiti in un file/directory che è elencato in sys.path
. Nella maggior parte dei casi è possibile trovare il nome del file dal quale viene importato un modulo controllando l'attributo __file__
del modulo in questione, ad es. six.__file__
. Tuttavia con six.moves
le cose non sono così semplici, proprio perché i moduli esposti potrebbero non mappare effettivamente uno a uno con i veri moduli Python ma con versioni compromesse.
Stai chiedendo a cosa serve "six.moves.urllib"? Hai letto il manuale? https://pythonhosted.org/six/#module-six.moves - O vuoi sapere come è implementato esattamente (nel qual caso il codice sorgente è disponibile ...)? – deceze