Saisie utilisateur et arguments de ligne de commande [fermé]

525

Comment puis-je avoir un script Python qui a) peut accepter les entrées utilisateur et comment le faire b) lire des arguments s'il est exécuté à partir de la ligne de commande?

Teifion
la source
9
La réponse dépendra de votre version de Python. Python 3.x le fait un peu différemment de Python 2.7
alimenté à la vapeur
4
Et Python 2.7 le fait également un peu différemment des versions antérieures à 2.7, par exemple argparseau lieu de optparse.
HelloGoodbye

Réponses:

501

Pour lire les entrées utilisateur, vous pouvez essayer le cmdmodule pour créer facilement un mini-interpréteur de ligne de commande (avec des textes d'aide et la saisie semi-automatique) et raw_input( inputpour Python 3+) pour lire une ligne de texte de l'utilisateur.

text = raw_input("prompt")  # Python 2
text = input("prompt")  # Python 3

Les entrées de ligne de commande sont entrées sys.argv. Essayez ceci dans votre script:

import sys
print (sys.argv)

Il existe deux modules pour analyser les options de ligne de commande: optparse(obsolète depuis Python 2.7, utilisez argparseplutôt) et getopt. Si vous voulez simplement entrer des fichiers dans votre script, voyez la puissance de fileinput.

La référence de la bibliothèque Python est votre amie.

Antti Rasinen
la source
71
raw_inputa été renommé inputen Python 3.x - documentation ici
vapeur
1
Ma source préférée pour cela: tutorialspoint.com/python/python_command_line_arguments.htm et cela semble bien aussi: cyberciti.biz/faq/python-command-line-arguments-argv-example
Jordan Stewart
1
sys.argv doit être fourni avec un numéro d'argument, si vous supposez que vous passez un paramètre en tant que valeur, par exemple. python nom_fichier.py 2017-02-10 et vous voulez utiliser la date, ce devrait être sys.argv [1] sinon ce sera une liste telle que [nom_fichier.py, 10/02/2017]
Aravind Krishnakumar
467
var = raw_input("Please enter something: ")
print "you entered", var

Ou pour Python 3:

var = input("Please enter something: ")
print("You entered: " + var)
lbz
la source
26
Il convient de noter que vous n'avez pas à importer raw_input, c'est une fonction intégrée.
Dennis Golomazov
7
Vous n'avez pas besoin d'utiliser str () dans la concaténation d'impression car toutes les données saisies seront de type str (ing) par défaut (nombres pairs).
Goujon
202

raw_inputn'est plus disponible dans Python 3.x. Mais a raw_inputété renommé input, donc la même fonctionnalité existe.

input_var = input("Enter something: ")
print ("you entered " + input_var) 

Documentation du changement

à vapeur
la source
24
En Python 2.7, input () ne convertit pas les valeurs en chaînes. Donc, si vous essayez de faire ceci: input_variable1 = input ("Entrez le premier mot ou la phrase:"), vous obtiendrez une erreur: Traceback (dernier appel le plus récent): return eval (raw_input (prompt)) File "<string> ", ligne 1, dans <module> NameError: le nom" mauvais "n'est pas défini
IgorGanapolsky
input_var = input ("Appuyez sur 'E' et 'Entrée' pour quitter:") NameError: le nom 'e' n'est pas défini J'utilise Python 2.5. Comment, je peux surmonter cette erreur.
Deepak Dubey
Vous pouvez éviter l'avis de trace en utilisant l'importation suivante fournie avec Python 2.7:import fileinput result=[] for line in fileinput.input(): result.append(line)
Stefan Gruenwald
Voici plus de l'histoire et la justification: python.org/dev/peps/pep-3111
Julian
33

Le meilleur moyen de traiter les arguments de ligne de commande est le argparsemodule.

Utilisez raw_input()pour obtenir une entrée utilisateur. Si vous importez, readline modulevos utilisateurs auront la modification et l'historique des lignes.

Dave Webb
la source
readline uniquement disponible sur unix hors de la boîte cependant.
hérisson dément
5
argparse est le nouvel optparse
Niels Bom
18

Attention à ne pas utiliser la inputfonction, sauf si vous savez ce que vous faites. Contrairement à raw_input, inputacceptera n'importe quelle expression python, donc c'est un peu commeeval

Vhaerun
la source
15

Ce programme simple vous aide à comprendre comment alimenter les entrées utilisateur à partir de la ligne de commande et à afficher l'aide sur la transmission d'arguments non valides.

import argparse
import sys

try:
     parser = argparse.ArgumentParser()
     parser.add_argument("square", help="display a square of a given number",
                type=int)
    args = parser.parse_args()

    #print the square of user input from cmd line.
    print args.square**2

    #print all the sys argument passed from cmd line including the program name.
    print sys.argv

    #print the second argument passed from cmd line; Note it starts from ZERO
    print sys.argv[1]
except:
    e = sys.exc_info()[0]
    print e

1) Pour trouver la racine carrée de 5

C:\Users\Desktop>python -i emp.py 5
25
['emp.py', '5']
5

2) Passer un argument non valide autre que le nombre

C:\Users\bgh37516\Desktop>python -i emp.py five
usage: emp.py [-h] square
emp.py: error: argument square: invalid int value: 'five'
<type 'exceptions.SystemExit'>
Viswesn
la source
10

Utilisez 'raw_input' pour l'entrée depuis une console / un terminal.

si vous voulez juste un argument de ligne de commande comme un nom de fichier ou quelque chose par exemple

$ python my_prog.py file_name.txt

alors vous pouvez utiliser sys.argv ...

import sys
print sys.argv

sys.argv est une liste où 0 est le nom du programme, donc dans l'exemple ci-dessus sys.argv [1] serait "nom_fichier.txt"

Si vous voulez avoir des options complètes sur la ligne de commande, utilisez le module optparse.

Pev

Simon Peverett
la source
9

Si vous exécutez Python <2.7, vous avez besoin d’ optparse qui, comme l'explique le document, créera une interface avec les arguments de ligne de commande qui sont appelés lorsque votre application est exécutée.

Cependant, en Python ≥2.7, optparse a été déconseillé et a été remplacé par l' argparse comme indiqué ci-dessus. Un exemple rapide de la documentation ...

Le code suivant est un programme Python qui prend une liste d'entiers et produit la somme ou le max:

import argparse

parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('integers', metavar='N', type=int, nargs='+',
                   help='an integer for the accumulator')
parser.add_argument('--sum', dest='accumulate', action='store_const',
                   const=sum, default=max,
                   help='sum the integers (default: find the max)')

args = parser.parse_args()
print args.accumulate(args.integers)
Matt Olan
la source
6

S'il s'agit d'une version 3.x, utilisez simplement:

variantname = input()

Par exemple, vous souhaitez saisir 8:

x = input()
8

x sera égal à 8 mais ce sera une chaîne sauf si vous le définissez autrement.

Vous pouvez donc utiliser la commande convert, comme:

a = int(x) * 1.1343
print(round(a, 2)) # '9.07'
9.07
CorpseDead
la source
3

En Python 2:

data = raw_input('Enter something: ')
print data

En Python 3:

data = input('Enter something: ')
print(data)
marque
la source
2
import six

if six.PY2:
    input = raw_input

print(input("What's your name? "))
Will Charlton
la source