ฉันจะเข้าถึงอาร์กิวเมนต์บรรทัดคำสั่งใน Python ได้อย่างไร


362

ฉันใช้หลามเพื่อสร้างการตั้งค่าโครงการของฉัน แต่ฉันต้องการความช่วยเหลือในการรับอาร์กิวเมนต์บรรทัดคำสั่ง

ฉันพยายามทำสิ่งนี้บนเทอร์มินัล:

$python myfile.py var1 var2 var3

ในไฟล์ Python ของฉันฉันต้องการใช้ตัวแปรทั้งหมดที่เป็นอินพุต


1
โมดูลเบเกอร์เป็นเครื่องมือที่ยอดเยี่ยมสำหรับการเขียนแอพบรรทัดคำสั่งของ Python pypi.python.org/pypi/Baker/1.02
เข็ม Gronim

คำตอบ:


502

Python tutorial อธิบายไว้ :

import sys

print(sys.argv)

โดยเฉพาะอย่างยิ่งถ้าคุณเรียกใช้python example.py one two three:

>>> import sys
>>> print(sys.argv)
['example.py', 'one', 'two', 'three']

7
รถถัง แต่ตอนนี้ฉันจำเป็นต้องใช้ var1 ของฉันในการใช้งาน? เกิดอะไรขึ้นที่นี่ .. :)
ParisNakitaKejser

102
Dooh เข้าใจแล้ว (sys.argv [1]): D
ParisNakitaKejser

115
import sys

sys.argv[1:]

จะให้รายการของการขัดแย้ง (ไม่รวมชื่อไฟล์หลาม)


5
อะไร[1:]หมายถึง?
Kolob Canyon

8
@KolobCanyon หมายถึง "รับรายการย่อยที่เริ่มต้นจากดัชนี 1 จนถึงจุดสิ้นสุด" คือข้ามองค์ประกอบแรก
Kamil Jarosz

@KolobCanyon รับอาร์กิวเมนต์ที่สอง[1:]ขึ้นไปเนื่องจากอาร์กิวเมนต์แรกsys.argvคือโดยค่าเริ่มต้นแล้วชื่อของไฟล์ไพ ธ อนที่คุณกำลังเรียกใช้testrun.pyอยู่
Samuel Nde

94

ฉันขอแนะนำargparseซึ่งมาพร้อมกับ Python 2.7 และใหม่กว่า

argparseโมดูลช่วยลดรหัสจานหม้อไอน้ำและทำให้รหัสของคุณมีประสิทธิภาพมากขึ้นเพราะโมดูลจัดการกรณีการใช้งานมาตรฐานทั้งหมด (รวมถึง subcommands) สร้างความช่วยเหลือและการใช้งานให้คุณตรวจสอบและ sanitize การป้อนข้อมูลของผู้ใช้ - สิ่งที่คุณต้องกังวลเกี่ยวกับเมื่อคุณ กำลังใช้sys.argvวิธีการ และเป็นฟรี (ในตัว)

นี่เป็นตัวอย่างเล็ก ๆ :

import argparse

parser = argparse.ArgumentParser("simple_example")
parser.add_argument("counter", help="An integer will be increased by 1 and printed.", type=int)
args = parser.parse_args()
print(args.counter + 1)

และผลลัพธ์สำหรับ python prog.py -h

usage: simple_example [-h] counter

positional arguments:
  counter     counter will be increased by 1 and printed.

optional arguments:
  -h, --help  show this help message and exit

และpython prog.py 1อย่างที่คุณคาดหวัง:

2

7
คำตอบที่มีคุณภาพไม่แน่ใจว่าทำไมทุกคนที่นี่จะใช้วิธีการอื่นใดที่ได้รับที่นี่ โดยเฉพาะอย่างยิ่งตั้งแต่สร้างขึ้นใน! พวกคุณมีสิ่งที่ต้องทำดีกว่าการแยกวิเคราะห์หรือไม่?
Bassinator

เพียงพูดถึงวิธีที่คุณควรเข้าถึงอาร์กิวเมนต์เฉพาะใน args namespace: args.counter
MikeL

1
@Bassinator ในกรณีที่ไม่จำเป็นต้องมีการแยกวิเคราะห์ข้อโต้แย้ง
กิจกรรมลด

เพื่อใช้ค่าเริ่มต้นโดยไม่มีค่าเฉพาะในบรรทัดคำสั่งคุณสามารถใช้สิ่งที่ต้องการ: parser.add_argument('var3', nargs='?', type=int, default=3)var3 เป็นพารามิเตอร์เสริมถ้าคุณไม่ระบุค่าในบรรทัดคำสั่งคุณสามารถเข้าถึง var3 ในรหัสของคุณค่าเริ่มต้นสำหรับ var3 = 3
Albicocco

56

รหัสหลาม:

import sys

# main
param_1= sys.argv[1] 
param_2= sys.argv[2] 
param_3= sys.argv[3]  
print 'Params=', param_1, param_2, param_3

ภาวนา:

$python myfile.py var1 var2 var3

เอาท์พุท:

Params= var1 var2 var3 

24

คุณสามารถใช้sys.argvเพื่อรับอาร์กิวเมนต์เป็นรายการ

หากคุณต้องการเข้าถึงองค์ประกอบแต่ละรายการคุณสามารถใช้

sys.argv[i]  

โดยที่iindex 0จะทำให้ชื่อไฟล์ไพ ธ อนของคุณถูกเรียกใช้งาน ดัชนีใด ๆ หลังจากนั้นจะมีการส่งผ่านอาร์กิวเมนต์


6

ถ้าคุณเรียกมันว่าสิ่งนี้: $ python myfile.py var1 var2 var3

import sys

var1 = sys.argv[1]
var2 = sys.argv[2]
var3 = sys.argv[3]

คล้ายกับอาร์เรย์ที่คุณมีsys.argv[0]ซึ่งเป็นไดเรกทอรีการทำงานปัจจุบันเสมอ


6
sys.argv[0]ไม่ใช่ไดเรกทอรีการทำงานปัจจุบัน มันเป็นชื่อของไฟล์ที่กำลังดำเนินการ
ดู

5

บางสิ่งเพิ่มเติมที่ฉันคิดได้

ดังที่ @allsyed กล่าวว่า sys.argv ให้รายการของส่วนประกอบ (รวมถึงชื่อโปรแกรม) ดังนั้นหากคุณต้องการทราบจำนวนองค์ประกอบที่ส่งผ่านบรรทัดคำสั่งคุณสามารถใช้ len () เพื่อกำหนดได้ ตามนี้คุณสามารถออกแบบข้อความยกเว้น / ข้อผิดพลาดหากผู้ใช้ไม่ผ่านพารามิเตอร์จำนวนเฉพาะ

นอกจากนี้หากคุณกำลังมองหาวิธีที่ดีกว่าในการจัดการอาร์กิวเมนต์บรรทัดคำสั่งฉันขอแนะนำให้คุณดูที่https://docs.python.org/2/howto/argparse.html

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