web-dev-qa-db-fra.com

Erreur Python 2.7.10 "from urllib.request import urlopen" aucune demande de module nommée

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?

21
Steve Maguire

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.

38
NevDev
from urllib.request import urlopen, Request

Devrait tout résoudre

8
Maciej Osowski

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.

8
Jonathan Holloway

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)
5
boardrider

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.

De urllib2 documentation

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 

2
Anand S Kumar

Pour le moment, il semble que je pourrais surmonter cela en ajoutant un ? après l'URL.

0
user3291138

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

0
ceekay