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.


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

Odpowiedzi:



115
import sys

sys.argv[1:]

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


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

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 

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.


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.


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.