Пользовательский ввод и аргументы командной строки [закрыто]


525

Как мне получить скрипт Python, который а) может принимать пользовательский ввод, и как мне сделать его б) читать аргументы, если он запускается из командной строки?


9
Ответ будет зависеть от вашей версии Python. Python 3.x делает это немного иначе, чем Python 2.7
steampowered

4
И Python 2.7 также делает это немного иначе, чем версии до 2.7, например, argparseвместо optparse.
Привет, до свидания,

Ответы:


501

Для чтения пользовательского ввода , вы можете попробовать на cmdмодуль для легкого создания интерпретатора линии мини-команд (при помощи текстов и автодополнения) и raw_input( inputдля Python 3+) для чтения строки текста от пользователя.

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

Входы командной строки находятся в sys.argv. Попробуйте это в вашем скрипте:

import sys
print (sys.argv)

Есть два модуля для разбора параметров командной строки: optparse(устарело с Python 2.7, используйте argparseвместо) и getopt. Если вы просто хотите ввести файлы в свой скрипт, вот сила fileinput.

Библиотека ссылки Python является вашим другом.


71
raw_inputбыл переименован inputв Python 3.x - документация здесь
steampowered

1
Мой любимый источник для этого: tutorialspoint.com/python/python_command_line_arguments.htm, и это тоже хорошо выглядит: cyberciti.biz/faq/python-command-line-arguments-argv-example
Джордан Стюарт,

1
sys.argv должен быть снабжен номером аргумента, если предполагается, что вы передаете параметр в качестве значения, например. python file_name.py 2017-02-10 и вы хотите использовать дату, это должно быть sys.argv [1], иначе это будет список, такой как [file_name.py, 2017-02-10]
Аравинд

467
var = raw_input("Please enter something: ")
print "you entered", var

Или для Python 3:

var = input("Please enter something: ")
print("You entered: " + var)

26
Следует отметить, что вам не нужно импортировать raw_input, это встроенная функция.
Денис Голомазов,

7
Вам не нужно использовать str () для конкатенации печати, так как все введенные данные будут иметь тип str (ing) по умолчанию (четные числа).
Гужон

202

raw_inputбольше не доступен в Python 3.x. Но raw_inputбыл переименован input, поэтому такая же функциональность существует.

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

Документация об изменении


24
В Python 2.7 input () не преобразует значения в строки. Поэтому, если вы попытаетесь сделать это: input_variable1 = input ("Введите первое слово или фразу:"), вы получите сообщение об ошибке: Traceback (последний вызов был последним): return eval (raw_input (prompt)) File "<string> ", строка 1, в <module> NameError: имя 'bad' не определено
IgorGanapolsky

input_var = input («Нажмите« E »и« Enter »для выхода:») NameError: имя 'e' не определено. Я использую Python 2.5. Как, я могу преодолеть эту ошибку.
Дипак Дубей

Вы можете избежать уведомления Traceback, используя следующий импорт, который поставляется с Python 2.7:import fileinput result=[] for line in fileinput.input(): result.append(line)
Stefan Gruenwald

Вот еще история и обоснование: python.org/dev/peps/pep-3111
Джулиан

33

Лучший способ обработать аргументы командной строки - это argparseмодуль.

Используйте raw_input()для получения ввода пользователя. Если вы импортируете, readline moduleваши пользователи будут иметь редактирование строк и историю.


readline доступен только на Unix из коробки, хотя.
сумасшедший ежик

5
argparse - это новый optparse
Niels Bom

18

Будьте осторожны, чтобы не использовать inputфункцию, если вы не знаете, что делаете. В отличие от raw_input, inputпримет любое выражение Python, так что это вроде какeval


15

Эта простая программа поможет вам понять, как вводить пользовательский ввод из командной строки и показать справку о передаче неверного аргумента.

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) Найти квадратный корень из 5

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

2) Передача неверного аргумента кроме числа

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'>

10

Используйте raw_input для ввода с консоли / терминала.

если вы просто хотите аргумент командной строки, как имя файла или что-то вроде

$ python my_prog.py file_name.txt

тогда вы можете использовать sys.argv ...

import sys
print sys.argv

sys.argv - это список, где 0 - это имя программы, поэтому в приведенном выше примере sys.argv [1] будет "file_name.txt"

Если вы хотите иметь полные параметры командной строки, используйте модуль optparse.

пэВ


9

Если вы используете Python <2.7, вам нужен optparse , который, как объясняет документ, создаст интерфейс с аргументами командной строки, которые вызываются при запуске вашего приложения.

Однако в Python ≥2.7 функция optparse устарела и была заменена на argparse, как показано выше. Быстрый пример из документов ...

Следующий код представляет собой программу на Python, которая принимает список целых чисел и выдает либо сумму, либо максимум:

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)


6

Если это версия 3.x, просто используйте:

variantname = input()

Например, вы хотите ввести 8:

x = input()
8

x будет равен 8, но это будет строка, если вы не определите ее иначе.

Таким образом, вы можете использовать команду convert, например:

a = int(x) * 1.1343
print(round(a, 2)) # '9.07'
9.07

3

В Python 2:

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

В Python 3:

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.