스크립트에서 sys.argv [1] 의미


146

나는 현재 파이썬을 가르치고 있으며 단순화 된 용어로 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은 , 아마도에 따라, 더 나은 당신이 뭘 하려는지을위한
LLR을

답변:


334

이전 답변이 사용자의 지식에 대해 많은 가정을했음을 참고하고 싶습니다. 이 답변은 더 많은 튜토리얼 수준에서 질문에 답변을 시도합니다.

Python을 호출 할 때마다 sys.argv명령 행에서 인수를 공백으로 구분하여 나타내는 문자열 목록이 자동으로 표시됩니다. 이름은 argv 및 argc가 명령 행 인수를 나타내는 C 프로그래밍 규칙 에서 나옵니다 .

파이썬에 익숙해지면 목록과 문자열에 대해 더 배우고 싶지만 그 동안 알아야 할 몇 가지 사항이 있습니다.

인수가 표현 된대로 인쇄하는 스크립트를 작성하면됩니다. 또한 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)을 알아야하는 경우을 사용할 수 있습니다 sys.executable.

예제에서 사용자가 따옴표로 묶은 인수로 스크립트를 호출 한 경우 공백이 포함 된 인수를 수신 할 수 있으므로 사용자가 제공 한 인수 목록이 표시됩니다.

이제 파이썬 코드에서이 문자열 목록을 프로그램의 입력으로 사용할 수 있습니다. 목록은 0부터 시작하는 정수로 색인화되므로 list [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이 궁금합니다 . 그것은 내가 만약 내가 추가해야 뭔가 하지 파이썬 3하지만 파이썬 2에서 실행? @ 제이슨 R. Coombs
니콜라스

1
@NicholasLiu, Python 3을 사용하는 경우 추가 할 필요가 없습니다. 완전성을 위해 추가했습니다. 파이썬 2에서 실행하지 않으면 내가 설명한 것과 다른 결과를 얻을 수 있습니다. 시도 해봐.
Jason R. Coombs 1

@ JasonR.Coombs 나는 이것과 혼동된다 : sys.argv **is** automatically a list of strings. "주다"또는 "반품"을 의미합니까?
JinSnow

1
@Guillaume : 미묘한 의미 론적 차이이지만 Python에서는 sys.argv와 같은 이름에 객체에 대한 참조가 있습니다. 기술적으로 모듈 의 argv속성은 sys인수의 문자열을 포함하는 목록 객체에 대한 참조입니다. 함수 호출 또는 생성기 또는 다른 구성 을 사용 gives하거나 returns제안합니다. references또는 represents더 정확한 용어 수 있지만 수도 is가까운 충분하다.
Jason R. Coombs

@JasonR main. 모듈을 가져 와서 직접 호출 하고 (모듈 이름이라고 함 moduleA.py) 함수를 호출하면 어떻게됩니까 import moduleA; moduleA.main()? 이 경우 명령 줄 인수가 없습니다. 따라서 sys.argv[0]여전히 filenameie 를 나타내는 것으로 간주됩니다 . 인쇄해야 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 : \\ project-open \\ servers \\ projop \\ packages \\ intranet-timesheet2 \\ www \\ hours \\ y.py 상대 경로를 사용하는 방법이 있습니까? 파이썬 파일?
yaksh

25

sys.argv 목록입니다.

이 목록은 명령 행에 의해 작성되며 명령 행 인수 목록입니다.

예를 들면 다음과 같습니다.

커맨드 라인에 다음과 같이 입력하십시오.

python3.2 file.py something

sys.argv 리스트가 될 것이다 [ 'file.py', 'something']

이 경우 sys.argv[1] = 'something'


12

예를 들어 다음과 같이 스크립트를 호출하는 경우 Frederic의 답변에 추가하십시오.

./myscript.py foo bar

sys.argv[0]"./myscript.py" sys.argv[1]는 "foo"이고 sys.argv[2]"bar"는 ... 등입니다.

예제 코드에서 다음과 같이 스크립트를 호출하면 스크립트 ./myscript.py foo 출력이 "Hello there foo"가됩니다.


9

Jason의 답변에 몇 가지 점을 더 추가하십시오.

모든 사용자 제공 인수를 취하기 위해 : user_args = sys.argv[1:]

sys.argv를 (Jason이 언급 한) 문자열 목록으로 고려하십시오. 따라서 모든 목록 조작이 여기에 적용됩니다. 이것을 "목록 슬라이싱"이라고합니다. 자세한 내용은 여기 를 참조 하십시오 .

구문은 다음과 같습니다. list [start : end : step]. 시작을 생략하면 기본값은 0이되고 종료를 생략하면 목록의 길이가 기본값이됩니다.

세 번째 인수 뒤에 모든 인수를 취하고 싶다고 가정하십시오.

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

명령 줄을 통해 스크립트를 실행하는 동안 파이썬 스크립트에 인수를 전달하려면

파이썬 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.argvsys모듈 의 속성입니다 . 명령 행에서 파일로 전달 된 인수를 나타냅니다. 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가 파이썬으로 전달 된 명령 줄 인수를 저장한다고 말할 수 있습니다.

이것을 시도하십시오 :

import sys
print sys.argv

argv는 파이썬리스트에 전달 된 모든 인수를 저장합니다. 위의 스크립트를 실행하면 전달 된 모든 인수가 인쇄됩니다.

이제 다음과 같이 filename.py를 실행하십시오.

python filename.py example example1

목록에 3 개의 인수가 인쇄됩니다.

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

마찬가지로 argv 1 은 처음 전달 된 인수 경우 'example'

비슷한 질문이 이미 여기에 있습니다 . 도움이 되었기를 바랍니다!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.