Obecnie uczę się Pythona i po prostu zastanawiałem się (w odniesieniu do mojego przykładu poniżej) w uproszczonych terminach, co sys.argv[1]
reprezentuje. Czy po prostu prosi o wkład?
#!/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()
Odpowiedzi:
Pragnę zauważyć, że poprzednie odpowiedzi zawierały wiele założeń dotyczących wiedzy użytkownika. Ta odpowiedź jest próbą odpowiedzi na pytanie na wyższym poziomie samouczka.
Dla każdego wywołania Pythona
sys.argv
jest automatycznie lista łańcuchów reprezentujących argumenty (oddzielone spacjami) w linii poleceń. Nazwa pochodzi z konwencji programowania C, w której argv i argc reprezentują argumenty wiersza poleceń.Będziesz chciał dowiedzieć się więcej o listach i ciągach znaków, gdy będziesz zaznajamiać się z Pythonem, ale w międzyczasie, oto kilka rzeczy, które warto wiedzieć.
Możesz po prostu utworzyć skrypt, który wypisze argumenty tak, jak są one reprezentowane. Wyświetla również liczbę argumentów, używając
len
funkcji z listy.Skrypt wymaga Pythona 2.6 lub nowszego. Jeśli wywołasz ten skrypt
print_args.py
, możesz wywołać go z różnymi argumentami, aby zobaczyć, co się stanie.Jak widać, argumenty wiersza poleceń zawierają nazwę skryptu, ale nie nazwę interpretera. W tym sensie Python traktuje skrypt jako plik wykonywalny. Jeśli chcesz znać nazwę pliku wykonywalnego (w tym przypadku python), możesz użyć
sys.executable
.Z przykładów widać, że możliwe jest otrzymanie argumentów, które zawierają spacje, jeśli użytkownik wywołał skrypt z argumentami ujętymi w cudzysłowy, więc otrzymujemy listę argumentów podaną przez użytkownika.
Teraz w swoim kodzie Pythona możesz użyć tej listy ciągów jako danych wejściowych do swojego programu. Ponieważ listy są indeksowane za pomocą liczb całkowitych zaczynających się od zera, można uzyskać poszczególne elementy za pomocą składni list [0]. Na przykład, aby uzyskać nazwę skryptu:
Chociaż jest to interesujące, rzadko musisz znać nazwę swojego skryptu. Aby uzyskać pierwszy argument po skrypcie dla nazwy pliku, możesz wykonać następujące czynności:
Jest to bardzo powszechne użycie, ale pamiętaj, że zakończy się niepowodzeniem z błędem IndexError, jeśli nie podano argumentu.
Ponadto Python umożliwia odwoływanie się do wycinka listy, więc aby uzyskać kolejną listę tylko argumentów dostarczonych przez użytkownika (ale bez nazwy skryptu), możesz zrobić
Dodatkowo Python umożliwia przypisanie sekwencji elementów (w tym list) do nazw zmiennych. Więc jeśli oczekujesz, że użytkownik zawsze będzie podawał dwa argumenty, możesz przypisać te argumenty (jako łańcuchy) do dwóch zmiennych:
Tak więc, odpowiadając na twoje konkretne pytanie,
sys.argv[1]
reprezentuje pierwszy argument wiersza poleceń (jako astring
) dostarczony do danego skryptu. Nie będzie monitować o wprowadzenie danych, ale zakończy się niepowodzeniem z błędem IndexError, jeśli w wierszu poleceń po nazwie skryptu nie zostaną podane żadne argumenty.źródło
sys.argv
, zastanawiam się, cofrom __future__ import print_function
robi ta linia . Czy jest to coś, co muszę dodać, jeśli NIE korzystam z Pythona 3, ale Pythona 2? @Jason R. Coombssys.argv **is** automatically a list of strings
. Czy masz na myśli „daje” czy „zwraca”?argv
widzenia atrybutsys
modułu jest odniesieniem do obiektu listy zawierającego ciągi argumentów. Aby użyćgives
lubreturns
zasugerować wywołanie funkcji, generator lub inną konstrukcję.references
lubrepresents
może być bardziej precyzyjnymi terminami, aleis
jest wystarczająco blisko.main
, importując moduł (powiedzmy, że nazwa modułu tomoduleA.py
) i wywołam funkcję jak wimport moduleA; moduleA.main()
. W tym przypadku nie ma żadnych argumentów wiersza polecenia .. tak jestsys.argv[0]
nadal powinien reprezentowaćfilename
tj. powinien wydrukowaćmoduleA.py
?sys.argv [1] zawiera pierwszy argument wiersza poleceń przekazany do twojego skryptu.
Na przykład, jeśli twój skrypt ma nazwę
hello.py
i wydajesz:lub:
Twój skrypt wydrukuje:
źródło
sys.argv
to lista.Ta lista jest tworzona przez linię poleceń, jest to lista argumentów linii poleceń.
Na przykład:
w linii poleceń wpisujesz coś takiego,
sys.argv
stanie się listą [„plik.py”, „coś”]W tym przypadku
sys.argv[1] = 'something'
źródło
Wystarczy dodać do odpowiedzi Frederica, na przykład jeśli wywołasz swój skrypt w następujący sposób:
./myscript.py foo bar
sys.argv[0]
byłoby „./myscript.py”sys.argv[1]
byłoby „foo” isys.argv[2]
byłoby „bar” ... i tak dalej.W Twoim przykładowym kodzie, jeśli wywołasz skrypt w następujący sposób
./myscript.py foo
, wyjście skryptu będzie brzmiało „Witaj foo”.źródło
Dodanie kilku dodatkowych punktów do odpowiedzi Jasona:
Aby wziąć wszystkie argumenty podane przez użytkownika:
user_args = sys.argv[1:]
Rozważ plik sys.argv jako listę ciągów, jak (wspomniane przez Jasona). Więc wszystkie manipulacje listami będą miały tutaj zastosowanie. Nazywa się to „podziałem na segmenty”. Więcej informacji znajdziesz tutaj .
Składnia jest następująca: list [początek: koniec: krok]. Jeśli pominiesz początek, domyślnie będzie to 0, a jeśli pominiesz koniec, domyślnie będzie to długość listy.
Załóżmy, że chcesz wziąć wszystkie argumenty po trzecim argumencie, a następnie:
Załóżmy, że chcesz tylko dwa pierwsze argumenty, a następnie:
Załóżmy, że chcesz argumenty od 2 do 4:
Załóżmy, że chcesz ostatni argument (ostatni argument ma zawsze wartość -1, więc to, co się tutaj dzieje, to zaczynamy liczenie od tyłu. Więc początek jest ostatnim, nie ma końca, nie ma kroku):
Załóżmy, że chcesz przedostatni argument:
Załóżmy, że potrzebujesz dwóch ostatnich argumentów:
Załóżmy, że potrzebujesz dwóch ostatnich argumentów. Tutaj początek to -2, czyli przedostatnia pozycja, a następnie do końca (oznaczonego „:”):
Załóżmy, że chcesz mieć wszystko oprócz ostatnich dwóch argumentów. Tutaj początek to 0 (domyślnie), a koniec to przedostatnia pozycja:
Załóżmy, że chcesz, aby argumenty były w odwrotnej kolejności:
Mam nadzieję że to pomoże.
źródło
sys.argv to lista zawierająca ścieżkę skryptu i argumenty wiersza poleceń; tj. sys.argv [0] jest ścieżką do uruchomionego skryptu, a wszyscy następujący członkowie są argumentami.
źródło
Przekazywanie argumentów do skryptu w języku Python podczas uruchamiania skryptu za pośrednictwem wiersza poleceń
tutaj nazwa skryptu - create_thumbnail.py, argument 1 - test1.jpg, argument 2 - test2.jpg
W skrypcie create_thumbnail.py używam
co daje mi listę argumentów, które przekazałem w wierszu poleceń jako ['test1.jpg', 'test2.jpg']
źródło
sys.argv
jest atrybutemsys
modułu. Mówi, że argumenty są przekazywane do pliku w linii poleceń.sys.argv[0]
przechwytuje katalog, w którym znajduje się plik.sys.argv[1]
zwraca pierwszy argument przekazany w linii poleceń. Pomyśl, jakbyśmy mieli plik example.py.example.py
Teraz w wierszu polecenia, kiedy to robimy:
Zwróci błąd indeksu w linii 2. Ponieważ nie przekazano jeszcze argumentu. Możesz zobaczyć długość argumentów przekazanych przez użytkownika za pomocą
if len(sys.argv) >= 1: # Code
. Jeśli uruchomimy example.py z przekazaniem argumentuDrukuje:
Ponieważ to był pierwszy argument! Powiedzmy, że utworzyliśmy plik wykonywalny przy użyciu PyInstaller. Zrobilibyśmy to:
Drukuje:
Jest to bardzo pomocne, gdy wydajesz polecenie w terminalu. Najpierw sprawdź długość argumentów. Jeśli nie przekazano żadnych argumentów, zrób tekst pomocy.
źródło
sys .argv wyświetli argumenty wiersza poleceń przekazane podczas uruchamiania skryptu lub możesz powiedzieć, że sys.argv będzie przechowywać argumenty wiersza poleceń przekazane w Pythonie podczas uruchamiania z terminala.
Po prostu spróbuj tego:
argv przechowuje wszystkie przekazane argumenty na liście Pythona. Powyższe wypisze wszystkie przekazane argumenty i uruchomi skrypt.
Teraz spróbuj uruchomić plik filename.py w ten sposób:
to wypisze 3 argumenty na liście.
Podobnie, argv 1 jest pierwszym przekazanym argumentem, w tym przypadku „przykład”
Przy okazji, podobne pytanie padło już tutaj . Mam nadzieję że to pomoże!
źródło