2014-09-13 6 views
1

그래서 초기 문제였습니다 :python + subproces.check_call : 파이썬에서 함수를 호출하는 방법?

# works(1) 
subprocess.check_call(["ls", "-l"]) 

#works(2), but "-l" argument not passed to called process 
subprocess.check_call(["ls", "-l"], shell=True) 

#works(3) again 
subprocess.check_call("ls -l", shell=True) 

#Exception(4): "bufsize must be an integer" 
subprocess.check_call("ls", "-l", shell=True) 

documention (https://docs.python.org/2/library/subprocess.html)에서 보면, subprocess.check_call는 서명이있는 경우 : subprocess.check_call(args, *, stdin=None, stdout=None, stderr=None, shell=False)

이 같은 파이썬에서 함수를 알고 def f(*args, **kwargs),하지만 을 , *을 의미할까요? *args과 같은가요?

어떤 방법이, 그 후 문서에 그주의가 :

전체 기능의 서명이는 popen 생성자와 동일

과는 popen 생성자 서명은 다음과 같습니다

Popen(args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=False, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0) 

왜 (4)가 실패했는지 분명하지만 왜 (2)가 잘못된 방식으로 작동합니까? 그리고이 이상한 표기법을 읽는 방법 : args, *, stdin=None?

(2) 작동하지 않는 이유를 찾을 수

업데이트. 대답 주셔서 감사합니다.이 구문의 관점에서 올바른지 이 이해합니다. 그래서 strace, 을 실행하고 파이썬이 "/ bin/sh"에 잘못된 방법으로 args를 넘기는 것을보십시오. 버그는 알려진 것으로 http://bugs.python.org/issue6689이며 거부되었습니다. 이거 슬프네.

답변

1

(2)입니다. ["ls", "-l"] 목록은 args으로 전달됩니다 (Popen.__init__).


*

Keyword-only arguments이다 그 후 그 인자를 나타낸다. 이것은 Python 3.x에서 소개되었습니다. 그러나 소스 코드에서 보았 듯이 실제 서명은 키워드 전용 인수를 사용하지 않습니다. 따라서 args 이외의 인수에 대해서는 위치 인수를 전달할 수 있습니다.

+0

그러나 파이썬 2.x 문서의 제 인용문에서 파이썬 3에 도입 된 경우 왜 파이썬 2에 사용됩니까? – fghj

+0

@ user1034749, 확실하지는 않지만, 제 생각에는 설명서의 독자가'args '다음에 인수에 대한 위치 인수 대신 키워드 인수를 사용하도록 권장하는 것 같습니다. – falsetru

+0

실제로 (2)는 sytanx 포인트 뷰에서만 유효합니다. 하지만 http://bugs.python.org/issue6689 때문에 Linux에서 사용 지점보기가 잘못되었습니다. 대답 해줘서 고마워. – fghj

관련 문제