2013-11-27 5 views
0

누구든지 파이썬에서 배치 스크립트의 %*과 동일한 기능을 알고 있습니까?% * 파이썬에서 같음

설명 : 배치 파일 %*은 명령 줄에 지정된 모든 매개 변수입니다. 다른 프로그램에 매개 변수를 전달하려는 경우 매우 유용합니다.

내 문제는 내가 파이썬 호출에 일괄 호출을 변환 할 것입니다 :

일괄 호출은 다음과 같습니다?

무엇
trial.bat %* 


에 해당하는 파이썬 전화 (PS 난 그냥 할 수있는 알고

나는 다음과 같은 시도) 전체 sys.argv 목록을 가서 어떤 문자열에 매개 변수를 추가하고 배치 파일이 통과,하지만 난 여기에 간단한 해결책을 찾고 있어요 :

os.system('trial.bat '+sys.argv) 
os.system('trial.bat '+sys.argv[1:]) 

하지만 작동하지 않습니다. 나는 argparse을 사용하여 유사한 것을 시도했다. 그것도 작동하지 않습니다. 도와주세요.

답변

4

sys.argv[1:]과 매우 비슷합니다. 것은 argv이 인수 목록이고 [1:]은 목록의 조각이며 다시 목록입니다. 당신이 결합 된 모든 인수의 문자열을 원하는 경우에, 당신은 다시 가입 할 수 있습니다 :

subprocess.check_call(['trial.bat'] + sys.argv[1:]) 

하위 프로세스가 많이있다 :

os.system('trial.bat ' + ' '.join(sys.argv[1:])) 

심지어 더 나은, 당신은 메서드의 인수 목록을 수락 subprocess 모듈을 사용 매개 변수를 처리 할 때 더 유연하며 argv의 구문 분석과 유사하게 동작합니다. 인수 foo "hello world" bar있는 스크립트를 호출 할 때 예를 들어, ARGV이 포함됩니다 : 이제

>>> sys.argv[1:] 
['foo', 'hello world', 'bar'] 

을 우리는 단순히이리스트에 가입한다면, 우리는 당신으로 하나의 문자열

>>> ' '.join(sys.argv[1:]) 
'foo hello world bar' 

를 얻을 것 알 수 있듯이 복합 인수 hello world의 정보가 손실되어 완전히 다른 의미를 갖습니다.

그러나 subprocess을 사용하면 목록과 하위 프로세스가 자동으로 이러한 인수를 호출 된 프로그램에 올바르게 전달할 수 있습니다. 따라서 호출 된 프로그램은 hello world을 결합 된 인수로도 사용할 수 있습니다.

+0

awesome..os.system ('trial.bat'+ ''.join (sys.argv [1 :])) 나를 위해서 일했습니다. 감사합니다. – tejas

+0

배치 파일을 실행하려면 쉘이 필요하므로'subprocess.check_call'이 작동하지 않습니다. – abarnert

+1

@abarnert 배치 파일은 시스템에서 실행할 수 없으므로 쉘을 통과 할 필요가 없습니다. 확실히 작동합니다. – poke

3

당신은 subprocess.Popen을 원하는 (또는 중 하나는 편리 래퍼의) :

import subprocess 
import sys 
process = subprocess.Popen(['trial.bat'] + sys.argv[1:]) 
process.wait() 

는 그것은 확실히 os.system 선호합니다. 여기에있는 이점은 효과적으로 의미를 유지하기 위해 인용해야 할 수도있는 명령 줄 인수입니다. 또한이 대안은 서브 쉘을 작성하지 않으므로 os.system보다 안전합니다.

+0

껍질없이'.bat' 파일을 실행할 수 없다는 점을 제외하고는. – abarnert

+0

또한 '호출'을 수행하는 대신 '대기'를 호출하기 위해 왜 'Popen'을 생성해야합니까? – abarnert

+0

"껍질없이 .bat 파일을 실행할 수 없다는 점을 제외하고는." 그 문서를 보여줄 수 있습니까? – nephi12

0

os.system을 사용하려면 수동으로 명령 행을 다시 입력해야합니다.파이썬은 이미 커맨드 라인을 별도의 인수로 구문 분석했습니다 (또는 MSVCRT는 파이썬을 대신하여이를 수행했습니다). 즉, 다시 연결하지 않고 적절히 인용해야합니다.

MSVCRT가 원하는 방식으로 "견적을 적절하게"처리하는 stdlib에는 아무 것도 없습니다. 이는 Windows 인용이 실제로 모호하기 때문에 부분적으로는 그렇습니다. 왕복 여행이 불가능한 경우가 있습니다. 그러나 단순한 경우 POSIX 스타일의 인용 부호 (shlex.quote)를 사용하거나 각 인수를 따옴표로 묶는 것만으로 효과적입니다. 그래서,이 중 하나를

args = ' '.join(shlex.quote(arg) for arg in [program] + sys.argv[1:]) 
args = ' '.join('"{}"'.format(arg) for arg in [program] + sys.argv[1:]) 

그런 다음 :

os.system(args) 

그러나 subprocess를 사용하여이 os.system보다 낫다. 한 가지 이유는 당신이 인용하는 것을 바이올린 할 필요가 없다는 것입니다. 당신은이 작업을 수행 할 수 있습니다이 쉘에 전달하지만, 지금은 "사람"이 subprocess 모듈은 코드보다는이다 할 수 있도록

subprocess.check_call([program] + sys.argv[1:], shell=True) 

누군가가 여전히 문자열에 다시 함께 인수 목록을 넣어 필요 .