Jak uzyskać dostęp do argumentów wiersza poleceń w Pythonie?

362

Korzystam z Pythona, aby utworzyć konfigurację ustawień projektu, ale potrzebuję pomocy w uzyskaniu argumentów wiersza poleceń.

Próbowałem tego na terminalu:

$python myfile.py var1 var2 var3

W moim pliku Python chcę używać wszystkich wprowadzanych zmiennych.

ParisNakitaKejser
źródło
1
Moduł piekarza jest doskonałym narzędziem do pisania aplikacji wiersza poleceń Pythona. pypi.python.org/pypi/Baker/1.02
Spike Gronim

Odpowiedzi:

502

Samouczek języka Python wyjaśnia :

import sys

print(sys.argv)

Mówiąc dokładniej, jeśli uruchomisz python example.py one two three:

>>> import sys
>>> print(sys.argv)
['example.py', 'one', 'two', 'three']
SilentGhost
źródło
7
Czołgi, ale teraz muszę użyć mojego var1? co się tutaj dzieje .. :)
ParisNakitaKejser
102
Dooh, mam to (sys.argv [1]): D
ParisNakitaKejser
115
import sys

sys.argv[1:]

poda ci listę argumentów (bez nazwy pliku python)

Ryan M.
źródło
5
Co [1:]znaczy
Kanion Kolob
8
@KolobCanyon oznacza „weź podlistę od indeksu 1 do końca”, tzn. Pomiń pierwszy element
Kamil Jarosz
@ KolobCanyon podnieś drugi argument w [1:]górę, ponieważ pierwszym argumentem sys.argvjest domyślnie nazwa pliku Pythona, na przykład uruchomionego testrun.py.
Samuel Nde
94

Gorąco polecam, argparsektóry pochodzi z Python 2.7 i nowszych.

argparseModuł zmniejsza kod płytkę kocioł i sprawia, że Twój kod bardziej wytrzymałe, ponieważ moduł obsługuje wszystkie przypadki standardowe użytkowania (w tym podpoleceń), generuje pomoc i wykorzystanie dla Ciebie, kontrole i zdezynfekować wejście użytkownika - wszystkie rzeczy trzeba się martwić, kiedy stosują sys.argvpodejście. I to za darmo (wbudowane).

Oto mały przykład:

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)

i dane wyjściowe dla 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

i python prog.py 1ponieważ, jak można się spodziewać:

2
Michael Dorner
źródło
7
Odpowiedź wysokiej jakości, nie bardzo do końca pewna, dlaczego ktoś tutaj zastosowałby inne podane tutaj podejścia. Zwłaszcza, że jest wbudowany! Nie macie lepszych rzeczy do roboty niż parsowanie?
Bassinator,
Wystarczy wspomnieć, w jaki sposób należy uzyskać dostęp do konkretnego argumentu w przestrzeni nazw args: args.counter
MikeL
1
@Bassinator W przypadkach, gdy nie jest potrzebne analizowanie argumentów.
zmniejszenie aktywności
aby użyć wartości domyślnej, bez określonej wartości w wierszu polecenia, możesz użyć czegoś takiego: parser.add_argument('var3', nargs='?', type=int, default=3)var3 to opcjonalny parametr, jeśli nie określisz wartości w wierszu polecenia, możesz uzyskać dostęp do var3 w kodzie, wartość domyślna dla var3 = 3
Albicocco
56

Kod 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

Wezwanie:

$python myfile.py var1 var2 var3

Wynik:

Params= var1 var2 var3 
Charles P.
źródło
24

Możesz użyć, sys.argvaby uzyskać argumenty jako listę.

Jeśli potrzebujesz dostępu do poszczególnych elementów, możesz użyć

sys.argv[i]  

gdzie ijest indeksem, 0daje nazwę wykonywanego pliku python. Wszelkie kolejne indeksy są przekazywanymi argumentami.

sprzymierzył się
źródło
6

Jeśli nazwiesz to tak: $ python myfile.py var1 var2 var3

import sys

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

Podobnie jak w przypadku macierzy, sys.argv[0]które są zawsze bieżącym katalogiem roboczym.

lvadim01
źródło
6
sys.argv[0]nie jest bieżącym katalogiem roboczym. Jest to nazwa wykonywanego pliku.
patrz
5

Kilka dodatkowych rzeczy, o których mogę myśleć.

Jak powiedział @allsyed, sys.argv podaje listę komponentów (w tym nazwę programu), więc jeśli chcesz poznać liczbę elementów przekazywanych przez wiersz poleceń, możesz użyć len (), aby to ustalić. Na tej podstawie możesz zaprojektować komunikaty o wyjątkach / błędach, jeśli użytkownik nie przekaże określonej liczby parametrów.

Również jeśli szukasz lepszego sposobu na obsługę argumentów wiersza poleceń, sugeruję, aby spojrzeć na https://docs.python.org/2/howto/argparse.html

Rohan Sadale
źródło