sys.argv [1] значення в сценарії


146

В даний час я викладаю себе Python і просто цікавився (з посиланням на мій приклад нижче) спрощеними термінами, що собою sys.argv[1]являє. Це просто запит на введення?

#!/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()

2
Це не є частиною питання, і воно дуже давнє, але модуль argparse , ймовірно, краще для того, що ви намагаєтесь зробити, відповідно до цього
llrs

Відповіді:


334

Хочу зазначити, що попередні відповіді дали багато припущень щодо знань користувача. Ця відповідь намагається дати відповідь на запитання на більш навчальному рівні.

Для кожного виклику Python sys.argvавтоматично складається список рядків, що представляють аргументи (як розділені пробілами) в командному рядку. Назва походить від конвенції програмування С, в якій argv і argc представляють аргументи командного рядка.

Ви хочете дізнатися більше про списки та рядки під час ознайомлення з Python, але тим часом, ось кілька речей, які потрібно знати.

Ви можете просто створити сценарій, який друкує аргументи так, як вони представлені. Він також друкує кількість аргументів, використовуючи lenфункцію зі списку.

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

Сценарій вимагає Python 2.6 або новішої версії. Якщо ви викликаєте цей скрипт print_args.py, ви можете викликати його різними аргументами, щоб побачити, що відбувається.

> 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

Як бачите, аргументи командного рядка містять ім'я скрипта, але не ім'я інтерпретатора. У цьому сенсі Python розглядає сценарій як виконуваний файл. Якщо вам потрібно знати ім'я виконуваного файлу (python в цьому випадку), ви можете використовувати sys.executable.

З прикладів видно, що можна отримувати аргументи, які містять пробіли, якщо користувач посилався на сценарій з аргументами, інкапсульованими в лапки, тож ви отримуєте список аргументів, наданих користувачем.

Тепер у вашому коді Python ви можете використовувати цей список рядків як вхід до вашої програми. Оскільки списки індексуються нульовими цілими числами, ви можете отримати окремі елементи за допомогою синтаксису списку [0]. Наприклад, щоб отримати ім'я сценарію:

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

Хоча це цікаво, вам рідко потрібно знати назву сценарію. Щоб отримати перший аргумент після сценарію для імені файлу, ви можете зробити наступне:

filename = sys.argv[1]

Це дуже поширене використання, але зауважте, що воно не вдасться з IndexError, якщо аргумент не наводиться.

Також Python дозволяє посилатися на фрагмент списку, так що для отримання іншого списку лише аргументів, що надаються користувачем (але без назви сценарію), ви можете зробити

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

Крім того, Python дозволяє призначити послідовність елементів (включаючи списки) імен змінних. Отже, якщо ви очікуєте, що користувач завжди надасть два аргументи, ви можете призначити ці аргументи (як рядки) двом змінним:

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

Отже, щоб відповісти на ваше конкретне запитання, sys.argv[1]представляє перший аргумент командного рядка (як а string), наданий до відповідного сценарію. Він не запросить введення, але він не вдасться за допомогою IndexError, якщо в командному рядку після імені сценарію не буде подано жодних аргументів.


1
Коли ви показуєте список рядків sys.argv, мені цікаво, що from __future__ import print_functionробить рядок . Чи потрібно щось додати, якщо я працюю не на Python 3, а на Python 2? @Jason R. Coombs
Nicholas

1
@NicholasLiu, вам не потрібно додавати його, якщо ви на Python 3. Я додав його для повноти. Спробуйте запустити без нього на Python 2, і ви отримаєте інші результати, ніж те, що я описав. Спробувати.
Джейсон Р. Кумбс

@ JasonR.Coombs Я заплутувати з цим: sys.argv **is** automatically a list of strings. Ви маєте на увазі "дає" чи "повернути"?
JinSnow

1
@Guillaume: Це тонка смислова різниця, але в Python такі назви, як sys.argv, містять посилання на об'єкти. Таким чином, технічно argvатрибут sysмодуля є посиланням на об'єкт списку, що містить рядки аргументів. Використовувати givesабо returnsпропонувати виклик функції або генератор чи іншу конструкцію. referencesабо, representsможливо, точніші терміни, але isце досить близько.
Джейсон Р. Кумбс

@ JasonR.Coombs, що станеться, якщо я безпосередньо зателефоную main, імпортуючи модуль (скажімо, ім'я модуля moduleA.py) та зателефонуй функції, як у import moduleA; moduleA.main(). У цьому випадку аргументів командного рядка немає .. тому все sys.argv[0]одно належить представляти filenameтобто. це має роздрукувати moduleA.py?
alpha_989

34

sys.argv [1] містить перший аргумент командного рядка, переданий вашому сценарію.

Наприклад, якщо ваш сценарій названий hello.pyі ви видаєте:

$ python3.1 hello.py foo

або:

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

Ваш сценарій буде надруковано:

Привіт, там foo

Я повинен запустити цю команду: exec py C: \\ проект-відкрити \\ сервери \\ projop \\ пакети \\ intranet-timesheet2 \\ www \\ години \\ y.py Чи є спосіб використовувати відносний шлях для файл python?
якш

25

sys.argv - це список.

Цей список створений вашим командним рядком, це список аргументів вашого командного рядка.

Наприклад:

у своєму командному рядку ви вводите щось подібне,

python3.2 file.py something

sys.argv стане списком ['file.py', 'something']

В цьому випадку sys.argv[1] = 'something'


12

Просто додавши відповідь Фредеріка, наприклад, якщо ви називаєте свій сценарій наступним чином:

./myscript.py foo bar

sys.argv[0]буде "./myscript.py" sys.argv[1]було б "foo" і sys.argv[2]було б "бар" ... і так далі.

У вашому прикладі коду, якщо ви будете називати сценарій наступним чином ./myscript.py foo , вихід сценарію буде "Hello there foo".


9

Додавання ще кількох пунктів до відповіді Джейсона:

Для прийняття всіх аргументів, наданих користувачем: user_args = sys.argv[1:]

Розглянемо sys.argv як список рядків як (згадував Джейсон). Тож всі маніпуляції зі списком застосовуватимуться тут. Це називається "Розрізання списку". Для отримання додаткової інформації відвідайте тут .

Синтаксис такий: список [start: end: step]. Якщо ви пропустите старт, він буде за замовчуванням 0, а якщо ви випустите кінець, він буде за замовчуванням довжиною списку.

Припустимо, ви хочете взяти всі аргументи лише після 3-го аргументу, тоді:

user_args = sys.argv[3:]

Припустимо, ви хочете лише перші два аргументи, а потім:

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

Припустимо, ви хочете аргументи 2 до 4:

user_args = sys.argv[2:4]

Припустимо, ви хочете останнього аргументу (останній аргумент завжди -1, тому що тут відбувається - ми починаємо підрахунок ззаду. Отже, старт останній, не кінець, не крок):

user_args = sys.argv[-1]

Припустимо, вам потрібен другий останній аргумент:

user_args = sys.argv[-2]

Припустимо, вам потрібні два останні аргументи:

user_args = sys.argv[-2:]

Припустимо, вам потрібні два останні аргументи. Тут початок - -2, тобто другий останній елемент, а потім до кінця (позначений символом ":"):

user_args = sys.argv[-2:]

Припустимо, ви хочете всього, крім двох останніх аргументів. Тут початок - 0 (за замовчуванням), а кінець - другий останній елемент:

user_args = sys.argv[:-2]

Припустимо, ви хочете аргументи у зворотному порядку:

user_args = sys.argv[::-1]

Сподіваюся, це допомагає.


4

sys.argv - це список, що містить аргументи шляху сценарію та командного рядка; тобто sys.argv [0] - це шлях запущеного сценарію, а всі наступні члени - аргументи.


3

Для передачі аргументів до вашого сценарію python під час виконання сценарію через командний рядок

python create_thumbnail.py test1.jpg test2.jpg

тут назва сценарію - create_thumbnail.py, аргумент 1 - test1.jpg, аргумент 2 - test2.jpg

З сценарієм create_thumbnail.py, який я використовую

sys.argv[1:]

які дають мені список аргументів, які я передав у командному рядку як ['test1.jpg', 'test2.jpg']


1

sys.argvє атрибутом sysмодуля. У ньому йдеться про аргументи, передані у файл у командному рядку. sys.argv[0]вловлює каталог, де знаходиться файл. sys.argv[1]повертає перший аргумент, переданий у командному рядку. Подумайте, як у нас є файл example.py.

example.py

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

Тепер ось у командному рядку, коли ми це робимо:

python example.py

Це призведе до помилки індексу у рядку 2. Тому що аргумент ще не передано. Ви можете бачити довжину аргументів, переданих користувачем if len(sys.argv) >= 1: # Code. Якщо ми запустимо example.py з передачею аргументу

python example.py args

Він друкує:

args

Бо це була перша суперечка! Скажімо, ми зробили його виконуваним файлом за допомогою PyInstaller. Ми зробили б це:

example argumentpassed

Він друкує:

argumentpassed

Це дуже корисно, коли ви здійснюєте команду в терміналі. Спочатку перевірте довжину аргументів. Якщо жодних аргументів не було, виконайте текст довідки.


0

sys .argv відобразить аргументи командного рядка, передані під час запуску сценарію, або, можна сказати, sys.argv збереже аргументи командного рядка, передані в python, під час запуску з терміналу.

Просто спробуйте:

import sys
print sys.argv

argv зберігає всі аргументи, передані в списку python. Вище буде надруковано всі передані аргументи під час виконання сценарію.

Тепер спробуйте запустити файл filename.py так:

python filename.py example example1

це надрукує 3 аргументи у списку.

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

Аналогічно, argv 1 - перший аргумент, що передається, в даному випадку "приклад"

Аналогічне запитання було задано вже тут btw. Сподіваюся, це допомагає!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.