Bagaimana cara mengakses argumen baris perintah dengan Python?


362

Saya menggunakan python untuk membuat pengaturan pengaturan proyek saya, tetapi saya butuh bantuan untuk mendapatkan argumen baris perintah.

Saya mencoba ini di terminal:

$python myfile.py var1 var2 var3

Dalam file Python saya, saya ingin menggunakan semua variabel yang diinput.


1
Modul baker adalah alat yang hebat untuk menulis aplikasi baris perintah Python. pypi.python.org/pypi/Baker/1.02
Spike Gronim

Jawaban:



116
import sys

sys.argv[1:]

akan memberi Anda daftar argumen (tidak termasuk nama file python)


5
Apa [1:]artinya
Ngarai Kolob

8
@KolobCanyon artinya "ambil sublist mulai dari indeks 1 hingga akhir", yaitu lewati elemen pertama
Kamil Jarosz

@ KolobCanyon mengambil argumen kedua [1:]ke atas karena argumen pertama sys.argvadalah secara default nama file python yang Anda jalankan misalnya testrun.py.
Samuel Nde

95

Saya sangat merekomendasikan argparseyang datang dengan Python 2.7 dan yang lebih baru.

The argparseModul mengurangi kode pelat ketel dan membuat kode Anda lebih kuat, karena modul menangani semua kasus penggunaan standar (termasuk subcommands), menghasilkan bantuan dan penggunaan untuk Anda, cek dan membersihkan input pengguna - semua hal yang Anda harus khawatir tentang kapan Anda sedang menggunakansys.argv pendekatan. Dan itu gratis (built-in).

Berikut contoh kecil:

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)

dan output untuk 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

dan untuk python prog.py 1seperti yang Anda harapkan:

2

7
Kualitas jawaban, tidak begitu yakin mengapa ada orang di sini akan menggunakan salah satu dari pendekatan lain yang diberikan di sini. Terutama karena sudah terpasang! Bukankah kalian punya hal yang lebih baik untuk dilakukan daripada parsing?
Bassinator

Hanya untuk menyebutkan bagaimana Anda harus mengakses argumen spesifik di args namespace: args.counter
MikeL

1
@Bassinator Dalam kasus ketika tidak diperlukan penguraian argumen.
mengurangi aktivitas

untuk menggunakan nilai default, tanpa nilai spesifik di baris perintah, Anda dapat menggunakan sesuatu seperti: parser.add_argument('var3', nargs='?', type=int, default=3)var3 adalah param opsional, jika Anda tidak menentukan nilai di baris perintah Anda dapat mengakses ke var3 dalam kode Anda, nilai default untuk var3 = 3
Albicocco

56

Kode python:

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

Doa:

$python myfile.py var1 var2 var3

Keluaran:

Params= var1 var2 var3 

24

Anda dapat menggunakan sys.argvuntuk mendapatkan argumen sebagai daftar.

Jika Anda perlu mengakses elemen individual, Anda bisa menggunakannya

sys.argv[i]  

Di mana iindeks, 0akan memberi Anda nama file python dieksekusi. Indeks apa pun setelah itu adalah argumen yang lolos.


6

Jika Anda menyebutnya seperti ini: $ python myfile.py var1 var2 var3

import sys

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

Mirip dengan array yang juga Anda miliki, sys.argv[0]yang selalu merupakan direktori kerja saat ini.


6
sys.argv[0]bukan direktori kerja saat ini. Ini adalah nama file yang dieksekusi.
lihat

5

Beberapa hal tambahan yang bisa saya pikirkan.

Seperti @allsyed berkata sys.argv memberikan daftar komponen (termasuk nama program), jadi jika Anda ingin tahu jumlah elemen yang dilewatkan melalui baris perintah Anda dapat menggunakan len () untuk menentukannya. Berdasarkan ini, Anda dapat merancang pesan pengecualian / kesalahan jika pengguna tidak melewati sejumlah parameter tertentu.

Juga jika Anda mencari cara yang lebih baik untuk menangani argumen baris perintah, saya sarankan Anda melihat https://docs.python.org/2/howto/argparse.html

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.