Python에 argc 인수가 있습니까?


79

C와 C ++로 동일한 프로그램 (텍스트 파일 열기 및 내용 표시)을 작성했습니다. 이제 Python (Linux 시스템에서)에서 동일한 작업을 수행하고 있습니다.

C 프로그램에서 코드를 사용했습니다.

if (argc != 2) {
    /* exit program */
}

질문 : 인수의 수를 확인하기 위해 Python에서 사용되는 것은 무엇입니까?

#!/usr/bin/python
import sys
try:
    in_file = open(sys.argv[1], "r")
except:
    sys.exit("ERROR. Did you make a mistake in the spelling")
text = in_file.read()
print text
in_file.close()

전류 출력 :

./python names.txt = Displays text file (correct)
./python nam = error message: stated from the sys.ext line (correct)
./python = error message: stated from the sys.ext line (wrong: want it to be a
separate error message stating *no file name input*)


객체 방향 관점에서 왜 argc가 argv에 연결되어야하는지 이해할 수 있습니다. 이것이 두 개체라면 상호 의존적으로 변이 될 수 있습니다. argc가 sys가 아니라 argv의 속성이되는 것이 이치에 맞지만, len 이 내가 사용할 사실상의 속성 이름 인지 확실하지 않습니다 . argv .__ len__은 기계적인 이유로 매우 중요하며 거기에 다른 이름을 부여하는 것은 의미가 없습니다. 아마 프록시 기술자 같은 SYS를 선호했을 sys.argc = property(lambda self: len(self.argv)).__get__(sys, sys.__class__)불구하고
ThorSummoner

답변:


123

당신은 그냥 할 수 있도록 파이썬에서 목록, 길이를 알고있는 len(sys.argv)요소의 수를 얻을 argv.


import sys # 인수를 계산합니다 arguments = len (sys.argv)-1 print ( "스크립트는 % i 인수로 호출됩니다"% (인수))
Teo

17

나는 종종 명령 줄에서 고정 된 수의 인수를 읽기 위해 빠르고 더러운 트릭을 사용합니다.

[filename] = sys.argv[1:]

in_file = open(filename)   # Don't need the "r"

이것은 하나의 인수를 할당하고 filename정확히 하나의 인수가 없으면 예외를 발생시킵니다.



0

dir(sys)아니오라고 말합니다. len(sys.argv)작동하지만 Python에서는 권한보다 용서를 구하는 것이 낫습니다.

#!/usr/bin/python
import sys
try:
    in_file = open(sys.argv[1], "r")
except:
    sys.exit("ERROR. Can't read supplied filename.")
text = in_file.read()
print(text)
in_file.close()

잘 작동하고 더 짧습니다.

어쨌든 종료하려는 경우 다음이 더 좋습니다.

#!/usr/bin/python
import sys
text = open(sys.argv[1], "r").read()
print(text)

나는 print()2.7과 Python 3에서 작동하므로 사용 하고 있습니다.


나는 파이썬에서 대부분의 경우에 "허가보다 용서를 구하는 것이 더 낫다"를 좋아합니다. 그러나 명령 줄 인수의 경우 잘못된 수의 인수가있는 경우 Python 스크립트에 필요한 명령 줄 인수를 표시하는 것이 틀림없이 더 나은 사용자 경험입니다.
DoomGoober

@DoomGoober "제공된 파일 이름"은 예상되는 인수입니다.
Cees Timmerman
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.