2016-07-28 4 views
0

명령에 os.system을위한 매개 변수의 일부로 :

:

make foo -f $* 

는 다음과 같이이 파이썬 스크립트에서 호출 할 때 대 명령 줄에서 호출 다른 기능을 가지고 있습니다

import os 
os.system(make foo -f $*) 

여기에 명시된 바와 같이 : 박쥐 파일의 http://tldp.org/LDP/abs/html/internalvariables.html#APPREF $ *는 기본적으로 단일 단어로 간주되는 모든 위치 매개 변수입니다.

파이썬은 단순히 "$ *"로 해석합니다. 이 문제를 해결하고 동일한 기능을 복제 할 여지가 있습니까?

필자는 .bat 스크립트를 작성하여 파이썬으로 호출 할 수 있음을 알고 있지만, 더 웅변적인 것을 기대하고있었습니다.

+0

'os.system'에 대해서는 잊어 버리십시오. 'subprocess'와 * avoid = *'shell = True'를 가능한 한 많이 전달하는 함수를 항상 사용하십시오. – Bakuriu

답변

1

지적 했듯, $ *는 파이썬에서 특별한 의미가 없습니다. 이해는 전적으로 당신이 사용하고있는 쉘에 의해 완료됩니다. 당신은 몇 가지 명령 스크립트에 전달 된 모든 위치 매개 변수를 전달하고 싶은 경우에, 당신은 다음과 같은

import os, sys 
os.system("make foo -f {}".format(" ".join(sys.argv[1:]))) 

os.system이되지 않습니다하지만 있습니다 시도 할 수 있습니다. 대체로

import subprocess, sys 
subprocess.check_call("make foo -f {}".format(" ".join(sys.argv[1:])), shell=True) 

을 사용해야합니다. 코멘트에 제안으로

편집

명령이 같은 프로그램의 명령 줄로 "신뢰할 수없는"입력에서 구축 될 때마다, 하나는 shell=True를 사용하지 않아야합니다. 따라서 더 나은 대안은 사용하는 것입니다.

import subprocess, sys 
subprocess.check_call(['make', 'foo', '-f'] + sys.argv[1:]) 
+2

그렇게하기 위해'shell = True'를 사용할 이유가 없습니다. check_call ([ 'make', 'foo', '-f'] + sys.argv [1 :])을 사용하는 것보다 간단합니다.'join '을 호출하지 않아도됩니다. – Bakuriu

+0

@Bakuriu 좋은 지적 :) –

+0

@Bakuriu가 나를 때려 눕힌다. 예를 들어 여기에 쉘을 사용할 이유가 없다. 잠재적으로 "재미있는"명령이 잠길 수있는 곳에서는 피하는 것이 가장 좋다. –