อาร์กิวเมนต์อินพุตและบรรทัดรับคำสั่งของผู้ใช้ [ปิด]


525

ฉันจะมีสคริปต์ Python ที่ a) สามารถรับอินพุตของผู้ใช้ได้อย่างไรและฉันจะสร้างมันได้อย่างไร b) อ่านเป็นอาร์กิวเมนต์หากเรียกใช้จากบรรทัดคำสั่ง


9
คำตอบจะขึ้นอยู่กับเวอร์ชันของ Python Python 3.x ทำสิ่งนี้แตกต่างจาก Python 2.7
เล็กน้อย

4
และ Python 2.7 ยังไม่นี้แตกต่างกันเล็กน้อยกว่ารุ่นก่อน 2.7 เช่นแทนargparse optparse
HelloGoodbye

คำตอบ:


501

ในการอ่านอินพุตของผู้ใช้คุณสามารถลองใช้cmdโมดูลเพื่อสร้างล่ามบรรทัดคำสั่ง mini (พร้อมข้อความช่วยเหลือและการเติมข้อความอัตโนมัติ) และ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- ตัวอย่าง
Jordan Stewart

1
sys.argv จะต้องมีหมายเลขอาร์กิวเมนต์ถ้าสมมติว่าคุณผ่านพารามิเตอร์เป็นค่าเช่น python file_name.py 2017-02-10 และคุณต้องการใช้วันที่ควรเป็น sys.argv [1] มิฉะนั้นมันจะเป็นรายการเช่น [file_name.py, 2017-02-10]
Aravind Krishnakumar

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มันเป็นฟังก์ชั่นในตัว
Dennis Golomazov

7
คุณไม่จำเป็นต้องใช้ str () ในการต่อข้อมูลการพิมพ์เนื่องจากข้อมูลที่ป้อนทั้งหมดจะเป็นชนิด str (ing) ตามค่าเริ่มต้น (ตัวเลขคู่)
Goujon

202

raw_inputไม่มีใน Python 3.x อีกต่อไป แต่raw_inputถูกเปลี่ยนชื่อinputดังนั้นฟังก์ชั่นเดียวกันจึงมีอยู่

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

เอกสารของการเปลี่ยนแปลง


24
ใน Python 2.7 อินพุต () ไม่แปลงค่าเป็นสตริง ดังนั้นหากคุณพยายามทำสิ่งนี้: input_variable1 = input ("ป้อนคำหรือวลีแรก:") คุณจะได้รับข้อผิดพลาด: Traceback (การโทรล่าสุดครั้งล่าสุด): ส่งกลับ eval (raw_input (พรอมต์)) ไฟล์ "<string> ", บรรทัด 1, ใน <โมดูล> NameError: ไม่ได้กำหนดชื่อ 'bad'
IgorGanapolsky

input_var = input ("กด 'E' และ 'Enter' to Exit:") ไม่ได้กำหนด NameError: ชื่อ 'e' ฉันใช้ Python 2.5 ฉันจะเอาชนะข้อผิดพลาดนี้ได้อย่างไร
Deepak Dubey

คุณสามารถหลีกเลี่ยงการแจ้งการติดตามกลับได้โดยใช้การนำเข้าต่อไปนี้ซึ่งมาพร้อมกับ Python 2.7:import fileinput result=[] for line in fileinput.input(): result.append(line)
Stefan Gruenwald

นี่คือประวัติและเหตุผลเพิ่มเติม: python.org/dev/peps/pep-3111
Julian

33

วิธีที่ดีที่สุดในการประมวลผลอาร์กิวเมนต์บรรทัดคำสั่งคือargparseโมดูล

ใช้raw_input()เพื่อรับอินพุตของผู้ใช้ หากคุณนำเข้าreadline moduleผู้ใช้ของคุณจะมีการแก้ไขและประวัติบรรทัด


readline มีเฉพาะในยูนิกซ์นอกกรอบเท่านั้น
Hedgehog สมองเสื่อม

5
argparse เป็น optparse ใหม่
Niels Bom

18

ระวังอย่าใช้inputฟังก์ชั่นนอกจากคุณจะรู้ว่าคุณกำลังทำอะไรอยู่ ซึ่งแตกต่างจากraw_input, inputจะยอมรับการแสดงออกหลามใด ๆ ดังนั้นจึงเป็น kinda เช่น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

PEV


9

หากคุณใช้งาน Python <2.7 คุณจำเป็นต้องเลือกใช้งานซึ่ง doc อธิบายจะสร้างส่วนต่อประสานไปยังอาร์กิวเมนต์บรรทัดคำสั่งที่เรียกใช้เมื่อแอปพลิเคชันของคุณทำงาน

อย่างไรก็ตามใน Python .72.7 opt opt ​​ได้ถูกเลิกใช้แล้วและถูกแทนที่ด้วยอาร์กิวเมนต์ตามที่แสดงด้านบน ตัวอย่างรวดเร็วจากเอกสาร ...

รหัสต่อไปนี้เป็นโปรแกรม 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


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.