Comment utiliser raw_input dans Python 3


553
import sys
print(sys.platform)
print(2**100)
raw_input()

J'utilise Python 3.1 et je n'arrive pas raw_inputà "geler" le pop-up dos. Le livre que je lis est pour Python 2.5 et j'utilise Python 3.1

Que dois-je faire pour résoudre ce problème?


1
hm, j'obtiens NameError: le nom 'raw_input' n'est pas défini lorsque j'essaie d'utiliser votre code. n'obtenez-vous pas la même chose?
SilentGhost


9
Il y a eu beaucoup de changements dans Python 3, donc vous ne devriez probablement pas essayer de le maîtriser en utilisant un livre pour 2.5 (qui est vraiment ancien).
Niklas B.

5
raw_input a été renommé en entrée en python 3
krystan honor

Obtenir une erreur http 401 lorsque je suis le lien Oauth2
Big Ian

Réponses:


1011

À partir de Python 3, a raw_input()été renommé input().

À partir de Quoi de neuf dans Python 3.0, deuxième élément de la section Builtins .


56
Il y avait à l'origine une fonction input () qui agissait quelque chose comme l'eval actuel (input ()). C'était un reste de Python qui était moins soucieux de la sécurité. Le changement a simplifié la langue. Voir aussi "importer ceci" pour une explication plus approfondie. Préférez-vous une langue morte à une langue qui évolue? Il y en a beaucoup autour.
meawoppl

9
J'apprends aussi le python et j'ai trouvé une différence entre input()et raw_input(). a = input()prendra l'entrée utilisateur et la mettra dans le bon type. Par exemple: si l'utilisateur tape 5, la valeur de aest entier 5. a = raw_input()prendra l'entrée utilisateur et la mettra sous forme de chaîne. Par exemple: si l'utilisateur tape 5, la valeur dans aest la chaîne '5' et non un entier. Je pensais que cela pourrait être une bonne info pour les débutants en python comme moi.
Vishnu Narang

10
@VishnuNarang Oui, c'est correct en Python 2. Mais en Python 3, ce comportement a changé, et l'entrée fait ce que raw_input a fait en Python 2.
balpha

4
@balpha: vient d'être vérifié. Vous avez raison. J'ai python 2.7 (Impossible de modifier la réponse pour le mentionner ...)
Vishnu Narang

3
@meawoppl Passer de python 2 à 3 était censé être une rupture. Cela ne signifie pas que cela devait être le cas. Un langage peut évoluer sans mourir et sans changer la signature de la fonction. Cela aide si vous n'avez pas de fonctions globales. Commencez avec le recul d'autres langues. Etc. La suppression de fonctions n'est pas non plus absente de la table.
dlamblin

117

Cela fonctionne en Python 3.x et 2.x:

# Fix Python 2.x.
try: input = raw_input
except NameError: pass
print("Hi " + input("Say something: "))

4
J'obtenais un problème de portée avec cette approche. Corrigé avec un global inputen haut de la fonction appelante.
kevlar1818 du

1
Cela me semble un peu plus propre: import __builtin__; input = getattr(__builtin__, 'raw_input', input)
mbarkhau

3
Python 3 n'a pas de module nommé __builtin__.
Cees Timmerman

@mbarkhau: c'est trop global. Et si vous appelez une bibliothèque qui ne s'y attend pas? __builtin__est renommé builtinsen Python 3. Les deux sont disponibles comme __builtins__dans CPython.
jfs

3
getattr(__builtins__, 'raw_input', input)renvoie la valeur par défaut lors de l'importation dans Python 2.7.2.
Cees Timmerman

45

Un moyen fiable de résoudre ce problème est

from six.moves import input

six est un module qui corrige la plupart des 2/3 des points communs de base de code.


1
Bonne idée ... et si vous le faites from six.moves import input as raw_input, vous pouvez conserver raw_inputvotre script et exécuter en utilisant les deux versions de Python.
eddy85br

15

Comme d'autres l'ont indiqué, la raw_inputfonction a été renommée inputen Python 3.0, et vous seriez vraiment mieux servi par un livre plus à jour, mais je tiens à souligner qu'il existe de meilleures façons de voir la sortie de votre script .

D'après votre description, je pense que vous utilisez Windows, vous avez enregistré un .pyfichier et vous double-cliquez dessus pour l'exécuter. La fenêtre du terminal qui apparaît se ferme dès la fin de votre programme, vous ne pouvez donc pas voir le résultat de votre programme. Pour résoudre ce problème, votre livre recommande d'ajouter une instruction raw_input/ inputpour attendre que l'utilisateur appuie sur Entrée. Cependant, comme vous l'avez vu, si quelque chose ne va pas, comme une erreur dans votre programme, cette instruction ne sera pas exécutée et la fenêtre se fermera sans que vous puissiez voir ce qui s'est mal passé. Vous trouverez peut-être plus facile d'utiliser une invite de commande ou IDLE.

Utilisez une invite de commande

Lorsque vous regardez la fenêtre de dossier qui contient votre programme Python, maintenez la touche Maj enfoncée et cliquez avec le bouton droit n'importe où dans la zone d'arrière-plan blanc de la fenêtre. Le menu qui apparaît doit contenir une entrée "Ouvrir la fenêtre de commande ici". (Je pense que cela fonctionne sur Windows Vista et Windows 7.) Cela ouvrira une fenêtre d'invite de commande qui ressemble à ceci:

    Microsoft Windows [Version 6.1.7601]
    Copyright (c) 2009 Microsoft Corporation.  All rights reserved.

    C:\Users\Weeble\My Python Program>_

Pour exécuter votre programme, tapez ce qui suit (en remplaçant le nom de votre script):

    python myscript.py

... et appuyez sur entrée. (Si vous obtenez une erreur indiquant que "python" n'est pas une commande reconnue, consultez http://showmedo.com/videotutorials/video?name=960000&fromSeriesID=96 ) Lorsque votre programme se termine, qu'il se termine avec succès ou non, la fenêtre restera ouvert et l'invite de commande apparaîtra à nouveau pour vous permettre de taper une autre commande. Si vous souhaitez réexécuter votre programme, vous pouvez appuyer sur la flèche vers le haut pour rappeler la commande précédente que vous avez entrée et appuyer sur entrée pour l'exécuter à nouveau, plutôt que d'avoir à taper le nom du fichier à chaque fois.

Utiliser IDLE

IDLE est un éditeur de programme simple qui est installé avec Python. Entre autres fonctionnalités, il peut exécuter vos programmes dans une fenêtre. Faites un clic droit sur votre .pyfichier et choisissez "Modifier dans IDLE". Lorsque votre programme apparaît dans l'éditeur, appuyez sur F5 ou choisissez "Exécuter le module" dans le menu "Exécuter". Votre programme s'exécutera dans une fenêtre qui reste ouverte après la fin de votre programme et dans laquelle vous pouvez entrer des commandes Python à exécuter immédiatement.


IDLE est-il installé avec Windows? Exécuter IDLE ou inactif dans mon terminal est vide.
vgoff

1
IDLE est installé avec Python sur Windows. Il apparaît comme un raccourci dans le menu Démarrer et comme une association de fichiers pour les fichiers .py, mais je ne pense pas qu'il y ait par défaut une commande «inactive» ajoutée à votre chemin. Si vous voulez le démarrer à partir de la ligne de commande, vous pouvez exécuterpythonw -m idlelib.idle
Weeble

Ceci explique cela. Je ne touche à Windows que pour gagner de l'argent, pas en tant que système d'exploitation. Je dirais alors que votre section "Utiliser IDLE" est alors biaisée. Vous devriez peut-être mentionner la sélectivité.
vgoff

3
Je ne suis pas sûr de comprendre. La question était spécifique à Windows. Il s'agit d'une "popup DOS". IDLE est installé dans le cadre de Python, mais certains distributeurs peuvent le séparer. Par exemple, dans Ubuntu, il semble que vous devez l'installer en tant que package séparé. La réponse suggère déjà une approche différente de celle demandée par le questionneur, je préfère donc ne pas y ajouter d'autres tangentes. FWIW J'utilise Linux à la maison et n'utilise Windows que là où je dois travailler.
Weeble

DOS étant l'acronyme de plusieurs systèmes d'exploitation étroitement liés qui ont dominé le marché compatible IBM PC entre 1981 et 1995, ou jusqu'à environ 2000, y compris les versions Microsoft Windows 95, 98 et Millennium Edition partiellement basées sur DOS.
vgoff

7

La solution de Timmerman fonctionne très bien lors de l'exécution du code, mais si vous ne souhaitez pas obtenir d' Undefined nameerreurs lors de l'utilisation de pyflakes ou d'un linter similaire, vous pouvez utiliser les éléments suivants à la place:

try:
    import __builtin__
    input = getattr(__builtin__, 'raw_input')
except (ImportError, AttributeError):
    pass

Eh, je reçois encore beaucoup d'erreurs dans pylint: Redefining built-in 'input' (redefined-builtin), Unable to import '__builtin__' (import-error), Invalid constant name "input" (invalid-name).
Babken Vardanyan

@BabkenVardanyan pylint est notoirement strict en ce qui concerne le style de code. Je recommande flake8ou pyflakesafin de ne pas prendre toute la journée avec des avertissements vides de sens.
jmagnusson

6

Voici un morceau de code que j'ai mis dans mes scripts que je ne veux pas exécuter dans un environnement py2 / 3-agnostique:

# Thank you, python2-3 team, for making such a fantastic mess with
# input/raw_input :-)
real_raw_input = vars(__builtins__).get('raw_input',input)

Vous pouvez maintenant utiliser real_raw_input. C'est assez cher mais court et lisible. L'utilisation de données brutes coûte généralement beaucoup de temps (en attente de données), ce n'est donc pas important.

En théorie, vous pouvez même assigner raw_input au lieu de real_raw_input mais il peut y avoir des modules qui vérifient l'existence de raw_input et se comportent en conséquence. Il vaut mieux rester prudent.


J'obtiens ceci lorsque je l'ai essayé: inputcons = vars ( builtins ) .get ('raw_input', input) TypeError: l'argument vars () doit avoir l' attribut dict

0

Ce n'est probablement pas la meilleure solution, mais avant de venir ici, je l'ai fait à la volée pour continuer à travailler sans avoir une pause rapide dans mes études.

def raw_input(x):
  input(x)

Ensuite, lorsque je lance raw_input('Enter your first name: ')le script sur lequel je travaillais, il le capture comme il le input()ferait.

Il y a peut-être une raison pour ne pas le faire, que je n'ai pas encore rencontré!


7
Pourquoi pas juste raw_input = input?
tonypdmtr
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.