sys.argv [1] artinya dalam skrip

146

Saya saat ini sedang belajar sendiri Python dan hanya ingin tahu (mengacu pada contoh saya di bawah) dalam istilah yang disederhanakan apa yang sys.argv[1]diwakilinya. Apakah itu hanya meminta input?

#!/usr/bin/python3.1

# import modules used here -- sys is a very standard one
import sys

# Gather our code in a main() function
def main():
  print ('Hello there', sys.argv[1])
  # Command line args are in sys.argv[1], sys.argv[2] ..
  # sys.argv[0] is the script name itself and can be ignored

# Standard boilerplate to call the main() function to begin
# the program.
if __name__ == '__main__':
  main()
Switchkick
sumber
2
Ini, bukan bagian dari pertanyaan, dan sudah sangat tua tetapi modul argparse , mungkin lebih baik untuk apa yang Anda coba lakukan, menurut ini
llrs

Jawaban:

334

Saya ingin mencatat bahwa jawaban sebelumnya membuat banyak asumsi tentang pengetahuan pengguna. Jawaban ini mencoba menjawab pertanyaan di tingkat tutorial yang lebih.

Untuk setiap permintaan Python, sys.argvsecara otomatis daftar string yang mewakili argumen (dipisahkan oleh spasi) pada baris perintah. Nama ini berasal dari konvensi pemrograman C di mana argv dan argc mewakili argumen baris perintah.

Anda akan ingin mempelajari lebih lanjut tentang daftar dan string saat Anda membiasakan diri dengan Python, tetapi sementara itu, berikut adalah beberapa hal yang perlu diketahui.

Anda cukup membuat skrip yang mencetak argumen saat direpresentasikan. Ini juga mencetak jumlah argumen, menggunakan lenfungsi pada daftar.

from __future__ import print_function
import sys
print(sys.argv, len(sys.argv))

Script membutuhkan Python 2.6 atau yang lebih baru. Jika Anda memanggil skrip ini print_args.py, Anda dapat menjalankannya dengan berbagai argumen untuk melihat apa yang terjadi.

> python print_args.py
['print_args.py'] 1

> python print_args.py foo and bar
['print_args.py', 'foo', 'and', 'bar'] 4

> python print_args.py "foo and bar"
['print_args.py', 'foo and bar'] 2

> python print_args.py "foo and bar" and baz
['print_args.py', 'foo and bar', 'and', 'baz'] 4

Seperti yang Anda lihat, argumen baris perintah menyertakan nama skrip tetapi bukan nama juru bahasa. Dalam pengertian ini, Python memperlakukan skrip sebagai executable. Jika Anda perlu tahu nama yang dapat dieksekusi (python dalam kasus ini), Anda dapat menggunakan sys.executable.

Anda dapat melihat dari contoh-contoh bahwa dimungkinkan untuk menerima argumen yang berisi spasi jika pengguna memanggil skrip dengan argumen yang di-enkapsulasi dalam tanda kutip, jadi yang Anda dapatkan adalah daftar argumen yang disediakan oleh pengguna.

Sekarang dalam kode Python Anda, Anda dapat menggunakan daftar string ini sebagai input untuk program Anda. Karena daftar diindeks oleh bilangan bulat berbasis nol, Anda bisa mendapatkan masing-masing item menggunakan sintaksis daftar [0]. Misalnya, untuk mendapatkan nama skrip:

script_name = sys.argv[0] # this will always work.

Meski menarik, Anda jarang perlu tahu nama skrip Anda. Untuk mendapatkan argumen pertama setelah skrip untuk nama file, Anda bisa melakukan hal berikut:

filename = sys.argv[1]

Ini adalah penggunaan yang sangat umum, tetapi perhatikan bahwa itu akan gagal dengan IndexError jika tidak ada argumen yang diberikan.

Selain itu, Python memungkinkan Anda referensi sepotong daftar, jadi untuk mendapatkan daftar lain hanya argumen yang disediakan pengguna (tetapi tanpa nama skrip), Anda dapat melakukan

user_args = sys.argv[1:] # get everything after the script name

Selain itu, Python memungkinkan Anda untuk menetapkan urutan item (termasuk daftar) ke nama variabel. Jadi jika Anda mengharapkan pengguna untuk selalu menyediakan dua argumen, Anda dapat menetapkan argumen tersebut (sebagai string) ke dua variabel:

user_args = sys.argv[1:]
fun, games = user_args # len(user_args) had better be 2

Jadi, untuk menjawab pertanyaan spesifik Anda, sys.argv[1]sajikan argumen baris perintah pertama (sebagai a string) yang disediakan untuk skrip yang dimaksud. Ini tidak akan meminta input, tetapi akan gagal dengan IndexError jika tidak ada argumen yang disediakan pada baris perintah mengikuti nama skrip.

Jason R. Coombs
sumber
1
Ketika Anda menunjukkan daftar string sys.argv, saya bertanya-tanya apa yang dilakukan garis from __future__ import print_function. Apakah ini sesuatu yang harus saya tambahkan jika saya TIDAK menjalankan Python 3 tetapi Python 2? @Jason R. Coombs
Nicholas
1
@NicholasLiu, Anda tidak perlu menambahkannya jika Anda menggunakan Python 3. Saya menambahkannya untuk kelengkapan. Coba jalankan tanpanya di Python 2 dan Anda akan mendapatkan hasil yang berbeda dari yang saya jelaskan. Cobalah.
Jason R. Coombs
@ JasonR.Coombs Saya bingung dengan yang satu ini: sys.argv **is** automatically a list of strings. Apakah maksud Anda "memberi" atau "kembali"?
JinSnow
1
@Guillaume: Ini perbedaan semantik yang halus, tetapi dalam Python, nama-nama seperti sys.argv menyimpan referensi ke objek. Jadi secara teknis, argvatribut sysmodul adalah referensi ke objek daftar yang berisi string argumen. Untuk menggunakan givesatau returnsmenyarankan pemanggilan fungsi atau generator atau konstruksi lain. referencesatau representsmungkin istilah yang lebih tepat, tetapi iscukup dekat.
Jason R. Coombs
@ JasonR.Coombs apa yang terjadi jika saya langsung memanggil maindengan mengimpor modul (misalkan nama modulnya moduleA.py) dan memanggil fungsi seperti pada import moduleA; moduleA.main(). Dalam hal ini, tidak ada argumen baris perintah .. jadi sys.argv[0]masih harus mewakili filenameie. itu harus dicetak moduleA.py?
alpha_989
34

sys.argv [1] berisi argumen baris perintah pertama yang diteruskan ke skrip Anda.

Misalnya, jika skrip Anda dinamai hello.pydan Anda menerbitkan:

$ python3.1 hello.py foo

atau:

$ chmod +x hello.py  # make script executable
$ ./hello.py foo

Script Anda akan dicetak:

Halo, foo
Frédéric Hamidi
sumber
Saya harus menjalankan perintah ini: exec py C: \\ project-open \\ server \\ projop \\ paket \\ intranet-timesheet2 \\ www \\ jam \\ y.py Apakah ada cara untuk menggunakan jalur relatif untuk file python?
yaksh
25

sys.argv adalah daftar.

Daftar ini dibuat oleh baris perintah Anda, ini daftar argumen baris perintah Anda.

Sebagai contoh:

di baris perintah Anda, Anda memasukkan sesuatu seperti ini,

python3.2 file.py something

sys.argv akan menjadi daftar ['file.py', 'something']

Pada kasus ini sys.argv[1] = 'something'

pengguna2205939
sumber
12

Cukup tambahkan jawaban Frederic, misalnya jika Anda memanggil skrip Anda sebagai berikut:

./myscript.py foo bar

sys.argv[0]akan menjadi "./myscript.py" sys.argv[1]akan menjadi "foo" dan sys.argv[2]akan menjadi "bar" ... dan sebagainya.

Dalam kode contoh Anda, jika Anda memanggil skrip sebagai berikut ./myscript.py foo , output skrip akan menjadi "Hello there foo".

CodeWombat
sumber
9

Menambahkan beberapa poin lagi ke Jason's Answer:

Untuk mengambil semua argumen yang disediakan pengguna: user_args = sys.argv[1:]

Pertimbangkan sys.argv sebagai daftar string sebagai (disebutkan oleh Jason). Jadi semua manipulasi daftar akan berlaku di sini. Ini disebut "Daftar Mengiris". Untuk info lebih lanjut, kunjungi di sini .

Sintaksnya seperti ini: list [start: end: step]. Jika Anda menghilangkan mulai, itu akan menjadi default ke 0, dan jika Anda menghilangkan akhir, itu akan default ke panjang daftar.

Misalkan Anda hanya ingin mengambil semua argumen setelah argumen ke-3, maka:

user_args = sys.argv[3:]

Misalkan Anda hanya menginginkan dua argumen pertama, maka:

user_args = sys.argv[0:2]  or  user_args = sys.argv[:2]

Misalkan Anda ingin argumen 2 hingga 4:

user_args = sys.argv[2:4]

Misalkan Anda menginginkan argumen terakhir (argumen terakhir selalu -1, jadi yang terjadi di sini adalah kita mulai menghitung dari belakang. Jadi, mulai adalah yang terakhir, tanpa akhir, tanpa langkah):

user_args = sys.argv[-1]

Misalkan Anda ingin argumen terakhir kedua:

user_args = sys.argv[-2]

Misalkan Anda ingin dua argumen terakhir:

user_args = sys.argv[-2:]

Misalkan Anda ingin dua argumen terakhir. Di sini, mulai adalah -2, yaitu item terakhir kedua dan kemudian ke akhir (dilambangkan dengan ":"):

user_args = sys.argv[-2:]

Misalkan Anda menginginkan segalanya kecuali dua argumen terakhir. Di sini, mulai adalah 0 (secara default), dan akhir adalah item terakhir kedua:

user_args = sys.argv[:-2]

Misalkan Anda ingin argumen dalam urutan terbalik:

user_args = sys.argv[::-1]

Semoga ini membantu.

Rahul
sumber
4

sys.argv adalah daftar yang berisi jalur skrip dan argumen baris perintah; yaitu sys.argv [0] adalah jalur skrip yang Anda jalankan dan semua anggota berikut adalah argumen.

TartanLlama
sumber
3

Untuk meneruskan argumen ke skrip python Anda saat menjalankan skrip melalui baris perintah

python create_thumbnail.py test1.jpg test2.jpg

di sini, nama skrip - create_thumbnail.py, argumen 1 - test1.jpg, argumen 2 - test2.jpg

Dengan skrip create_thumbnail.py saya gunakan

sys.argv[1:]

yang memberi saya daftar argumen yang saya sampaikan di baris perintah sebagai ['test1.jpg', 'test2.jpg']

JBJ
sumber
1

sys.argvadalah atribut dari sysmodul. Dikatakan argumen dilewatkan ke file di baris perintah. sys.argv[0]menangkap direktori tempat file tersebut berada. sys.argv[1]mengembalikan argumen pertama yang dilewatkan di baris perintah. Pikirkan seperti kami memiliki file example.py.

example.py

import sys # Importing the main sys module to catch the arguments
print(sys.argv[1]) # Printing the first argument

Sekarang di sini di command prompt ketika kita melakukan ini:

python example.py

Ini akan melempar kesalahan indeks pada baris 2. Karena tidak ada argumen yang dilewati. Anda bisa melihat panjang argumen yang dilewati oleh pengguna menggunakan if len(sys.argv) >= 1: # Code. Jika kita menjalankan example.py dengan memberikan argumen

python example.py args

Mencetak:

args

Karena itu argumen pertama! Katakanlah kita telah membuatnya menjadi file yang dapat dieksekusi menggunakan PyInstaller. Kami akan melakukan ini:

example argumentpassed

Mencetak:

argumentpassed

Ini sangat membantu ketika Anda membuat perintah di terminal. Pertama periksa panjang argumen. Jika tidak ada argumen yang lolos, lakukan teks bantuan.

Jaidee
sumber
0

sys .argv akan menampilkan args baris perintah yang dilewati saat menjalankan skrip atau Anda dapat mengatakan sys.argv akan menyimpan argumen baris perintah yang dilewatkan dalam python saat menjalankan dari terminal.

Coba ini:

import sys
print sys.argv

argv menyimpan semua argumen yang disahkan dalam daftar python. Di atas akan mencetak semua argumen yang lulus akan menjalankan skrip.

Sekarang coba ini jalankan filename.py Anda seperti ini:

python filename.py example example1

ini akan mencetak 3 argumen dalam daftar.

sys.argv[0] #is the first argument passed, which is basically the filename. 

Demikian pula, argv 1 adalah argumen pertama yang disahkan, dalam hal ini 'contoh'

Pertanyaan serupa telah diajukan di sini, btw. Semoga ini membantu!

geekidharsh
sumber