Input pengguna dan argumen baris perintah [tertutup]

525

Bagaimana cara saya memiliki skrip Python yang a) dapat menerima input pengguna dan bagaimana cara membuatnya b) membaca dalam argumen jika dijalankan dari baris perintah?

Teifion
sumber
9
Jawabannya akan tergantung pada versi Python Anda. Python 3.x melakukan ini sedikit berbeda dari Python 2.7
steampowered
4
Dan Python 2.7 juga melakukan ini sedikit berbeda dari versi sebelum 2.7, misalnya argparsebukannya optparse.
HelloGoodbye

Jawaban:

501

Untuk membaca masukan pengguna Anda dapat mencoba dengan cmdmodul untuk dengan mudah menciptakan garis interpreter perintah mini (dengan bantuan teks dan autocompletion) dan raw_input( inputuntuk Python 3 +) untuk membaca baris teks dari pengguna.

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

Input baris perintah ada di sys.argv. Coba ini di skrip Anda:

import sys
print (sys.argv)

Ada dua modul untuk opsi baris perintah parsing: optparse(ditinggalkan sejak Python 2.7, gunakan argparsesebagai gantinya) dan getopt. Jika Anda hanya ingin memasukkan file ke skrip Anda, lihatlah kekuatan fileinput.

The Python referensi perpustakaan adalah teman Anda.

Antti Rasinen
sumber
71
raw_inputdiubah namanya menjadi inputdalam Python 3.x - dokumentasi di sini
steampowered
1
Sumber favorit saya untuk ini: tutorialspoint.com/python/python_command_line_arguments.htm dan ini terlihat bagus juga: cyberciti.biz/faq/python-command-line-arguments-argv-example
Jordan Stewart
1
sys.argv perlu disertakan dengan nomor argumen, jika Anda melewati parameter sebagai nilai mis. python file_name.py 2017-02-10 dan Anda ingin menggunakan tanggal, itu harus sys.argv [1] kalau tidak itu akan menjadi daftar seperti [file_name.py, 2017-02-10]
Aravind Krishnakumar
467
var = raw_input("Please enter something: ")
print "you entered", var

Atau untuk Python 3:

var = input("Please enter something: ")
print("You entered: " + var)
lbz
sumber
26
Perlu dicatat bahwa Anda tidak perlu mengimpor raw_input, ini adalah fungsi bawaan.
Dennis Golomazov
7
Anda tidak harus menggunakan str () dalam rangkaian cetak karena semua data yang dimasukkan akan menjadi tipe str (ing) secara default (angka genap).
Goujon
202

raw_inputtidak lagi tersedia di Python 3.x. Tapi raw_inputdiganti namanya input, jadi fungsi yang sama ada.

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

Dokumentasi perubahan

ditenagai uap
sumber
24
Dalam Python 2.7, input () tidak mengonversi nilai menjadi string. Jadi jika Anda mencoba melakukan ini: input_variable1 = input ("Masukkan kata atau frasa pertama:"), Anda akan mendapatkan kesalahan: Traceback (panggilan terakhir terakhir): return eval (raw_input (prompt)) File "<string> ", line 1, dalam <module> NameError: name 'bad' tidak didefinisikan
IgorGanapolsky
input_var = input ("Tekan 'E' dan 'Enter' untuk Keluar:") NameError: name 'e' tidak didefinisikan Saya menggunakan Python 2.5. Bagaimana, saya bisa mengatasi kesalahan ini.
Deepak Dubey
Anda dapat menghindari pemberitahuan Traceback dengan menggunakan impor berikut yang disertai dengan Python 2.7:import fileinput result=[] for line in fileinput.input(): result.append(line)
Stefan Gruenwald
Berikut ini lebih banyak sejarah dan alasannya: python.org/dev/peps/pep-3111
Julian
33

Cara terbaik untuk memproses argumen baris perintah adalah argparsemodul.

Gunakan raw_input()untuk mendapatkan input pengguna. Jika Anda mengimpor, readline modulepengguna Anda akan memiliki pengeditan garis dan riwayat.

Dave Webb
sumber
readline hanya tersedia pada unix out of the box.
landak gila
5
argparse adalah optparse baru
Niels Bom
18

Berhati-hatilah untuk tidak menggunakan inputfungsi ini, kecuali Anda tahu apa yang Anda lakukan. Tidak seperti raw_input, inputakan menerima ekspresi python, jadi itu sepertieval

Vhaerun
sumber
15

Program sederhana ini membantu Anda dalam memahami cara memberi makan input pengguna dari baris perintah dan untuk menunjukkan bantuan saat melewati argumen yang tidak valid.

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) Untuk menemukan akar kuadrat dari 5

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

2) Melewati argumen yang tidak valid selain dari angka

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
sumber
10

Gunakan 'raw_input' untuk input dari konsol / terminal.

jika Anda hanya ingin argumen baris perintah seperti nama file atau sesuatu misalnya

$ python my_prog.py file_name.txt

maka Anda dapat menggunakan sys.argv ...

import sys
print sys.argv

sys.argv adalah daftar di mana 0 adalah nama program, jadi dalam contoh di atas sys.argv [1] adalah "file_name.txt"

Jika Anda ingin memiliki opsi baris perintah penuh gunakan modul optparse.

Pev

Simon Peverett
sumber
9

Jika Anda menjalankan Python <2.7, Anda perlu optparse , yang seperti dijelaskan oleh doc akan membuat antarmuka ke argumen baris perintah yang dipanggil saat aplikasi Anda dijalankan.

Namun, dalam Python ≥2.7, optparse telah ditinggalkan, dan diganti dengan argparse seperti yang ditunjukkan di atas. Contoh cepat dari dokumen ...

Kode berikut adalah program Python yang mengambil daftar bilangan bulat dan menghasilkan jumlah atau maks:

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
sumber
6

Jika ini versi 3.x maka cukup gunakan:

variantname = input()

Misalnya, Anda ingin memasukkan 8:

x = input()
8

x akan sama dengan 8 tetapi itu akan menjadi string kecuali jika Anda mendefinisikannya sebaliknya.

Jadi, Anda dapat menggunakan perintah convert, seperti:

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

Dengan Python 2:

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

Dengan Python 3:

data = input('Enter something: ')
print(data)
Menandai
sumber
2
import six

if six.PY2:
    input = raw_input

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