J'ai ouvert le code python de github
. J'ai supposé que c'était python2.x
et j'ai eu l'erreur ci-dessus lorsque j'ai essayé de l'exécuter. De la lecture que j’ai vue, Python 3 s’est déprécié de urllib
et l’a remplacé par un certain nombre de bibliothèques, dont urllib.request
.
On dirait que le code a été écrit en python 3 (une confirmation de la part de quelqu'un qui sait serait appréciée.) À ce stade, je ne veux pas passer à Python 3 - je n'ai pas cherché ce que cela ferait à ma code existant.
Pensant qu'il devrait y avoir un module urllib
pour Python 2
, j'ai cherché dans Google (en utilisant "python2 urllib download") et je n'en ai pas trouvé. (Cela a peut-être été caché dans les nombreuses réponses car urllib
inclut la fonctionnalité de téléchargement.) J'ai consulté mon répertoire Python27/lib
et je ne l'ai pas vu là . Puis-je obtenir une version de ce module qui fonctionne sur Python27
? Ou et comment?
Essayez d'utiliser urllib2:
https://docs.python.org/2/library/urllib2.html
Cette ligne devrait fonctionner pour remplacer urlopen:
from urllib2 import urlopen
Testé en Python 2.7 sur Macbook Pro
Essayez de poster un lien vers le git en question.
from urllib.request import urlopen, Request
Devrait tout résoudre
Au lieu d'utiliser urllib.request.urlopen (), supprimez la demande pour Python 2.
urllib.urlopen () vous n’avez pas besoin de demander en python 2.x ce que vous essayez de faire. J'espère que ça marche pour toi. Cela a été testé en utilisant python 2.7 Je recevais le même message d'erreur et cela l'a résolu.
Vous pouvez programmer de manière défensive et importer les éléments suivants:
try:
from urllib.request import urlopen
except ImportError:
from urllib2 import urlopen
puis dans le code, utilisez simplement:
data = urlopen(MIRRORS).read(AMOUNT2READ)
Vous avez raison, les packages urllib et urllib2 ont été scindés en packages urllib.request, urllib.parse et urllib.error en Python 3.x. Ces derniers packages n'existent pas dans Python 2.x
De documentation -
Le module urllib a été scindé en plusieurs parties et renommé en Python 3 en urllib.request, urllib.parse et urllib.error.
Le module urllib2 a été divisé en plusieurs modules de Python 3 nommés urllib.request et urllib.error.
Je suis donc presque sûr que le code que vous avez téléchargé a été écrit pour Python 3.x, car ils utilisent une bibliothèque uniquement présente dans Python 3.x.
Il y a un paquetage urllib en python, mais il n’a pas le sous-paquetage request. En outre, supposons que vous fassiez beaucoup de travail et que vous rendiez en quelque sorte le sous-package request disponible dans Python 2.x.
Il y a une très forte probabilité que vous rencontriez plus de problèmes, il y a beaucoup d'incompatibilités entre Python 2.x et Python 3.x, à la fin, vous finiriez très probablement par réécrire au moins la moitié du code de github (et la plupart probablement lire et comprendre le code complet à partir de là).
Même dans ce cas, il se peut que d’autres bogues découlent du fait que certains détails de la mise en œuvre ont changé entre Python 2.x et Python 3.x (à titre d’exemple - la compréhension de liste a son propre espace de noms dans Python 3.x)
Vous feriez mieux d'essayer de télécharger et d'utiliser Python 3 que d'essayer de rendre le code écrit pour Python 3.x compatible avec Python 2.x
Pour le moment, il semble que je pourrais surmonter cela en ajoutant un ?
après l'URL.
Changement
from urllib.request import urlopen
à
from urllib import urlopen
J'ai été capable de résoudre ce problème en changeant comme ceci. Pour Python2.7
dans macOS10.14