six ist ein Paket, das in dem Schreiben von Code hilft, das sowohl mit Python 2 und Python 3.
Eines der Probleme ist kompatibel Entwickler konfrontiert werden, wenn Code für Python2 Schreiben und 3 ist, dass die Namen von mehreren Modulen aus dem Standardbibliothek haben sich geändert, obwohl die Funktionalität gleich bleibt.
Das Modul six.moves
stellt diese Module unter einem gemeinsamen Namen für Python2 und 3 zur Verfügung (meist indem das Python2-Modul unter dem Namen des Python 3-Moduls bereitgestellt wird).
So Ihre Linie
from six.moves import urllib
Importe urllib
, wenn sie mit Python3 laufen und importiert eine Mischung aus urllib
, urllib2
und urlparse
mit Python2, urllib
die Struktur der Python3 des nachahmt. Siehe auch here.
EDIT die Aktualisierung der Frage zu beantworten:
TLDR; Es besteht nicht unbedingt eine direkte Beziehung zwischen dem importierten Modul urllib
und einer Datei auf dem Dateisystem in diesem Fall. Die relevante Datei ist genau das, was six.__file__
zeigt.
Module von Drittanbietern werden in einer Datei/Verzeichnis definiert, das in sys.path
aufgeführt ist. Die meiste Zeit können Sie den Namen der Datei finden, aus der ein Modul importiert wird, indem Sie das Attribut __file__
des fraglichen Moduls prüfen, z. six.__file__
. Allerdings sind die Dinge mit six.moves
nicht so einfach, gerade weil die exponierten Module tatsächlich nicht eins zu eins mit tatsächlichen Python-Modulen abbilden, sondern gehackte Versionen von diesen.
Fragen Sie, was 'six.moves.urllib' für? Hast du das Handbuch gelesen? https://pythonhosted.org/six/#module-six.moves - Oder wollen Sie wissen, wie es genau implementiert ist (in welchem Fall der Quellcode verfügbar ist ...)? – deceze