2015-01-26 4 views
0

와 subprocess.Popen. 달성하는 방법?파이썬 : 내 파이썬 스크립트에서이 줄을 실행해야하는 매개 변수 및 경로

+1

shell = True를 사용하여 목록에 명령을 넣지 말고,'>'도 출력물을 파일 객체로 방향을 바꾸기 만하면 작동하지 않습니다. –

+0

Python으로 Python을 호출하려고하므로 더 이해할 수 있습니다 대상 모듈을 가져 와서 함수를 직접 호출하기 만하면됩니다. 그런 다음 하위 프로세스 및 OS를 통하는 것보다 훨씬 자연스럽게 명령 줄 인수를 전달할 수 있습니다. – merlin2011

+0

@ merlin2011이 mapreduce (mrjob) 옵션이 아니거나 최소한 작업이 생성되기 때문에 어떻게해야할지 모르겠습니다. – nottinhill

답변

1

선.

import subprocess 
subprocess.Popen("python ~/mrjobScript.py --domain {1} ~/jobs/{0}/input/* > ~/jobs/{0}/output/output-{1}.log ".format(date,domain), shell=True) 

이렇게하면 하위 프로세스가 시작되고 코드의 다음 줄로 이동합니다. 귀하의 코드는 그것을 기다리지 않습니다. 코드를 기다리려면 대신 subprocess.call을 사용하는 것이 좋습니다. 경고의

참고 :이 shell=True의 사용자가 완전히 같은 사용의 의미를 이해하는 this answer와 상담하는 것이 좋습니다. 특히 이러한 응용 프로그램에서는 사용자 제공 인수가 subprocess.Popenshell=True에 대한 호출의 인수에 직접 또는 간접적으로 전달되지 않도록해야합니다.

+0

완벽하게 작동합니다. – nottinhill

+0

shell = True를 사용하는 것은 대개 매우 나쁜 생각입니다. –

+0

@PadraicCunningham, 그것이 전통적인 지혜이지만, 저는 세 가지 의견이 있습니다.1) 일반적인 인수는 보안입니다. OP가 사용자가 제공 한 인수를 자신의 스크립트에 전달한다는 명백한 증거는 없습니다. 2) 그것이 항상 나쁜 생각이라면, 파이썬 3이 제거되었을 것입니다. 3) 실용. 개발자의 시간은 소중하며, 자신의 프로그램 내에서 셸의 기능을 시뮬레이션하기 위해 거꾸로 구부리는 것은 실용적이지 않습니다. – merlin2011

2

shell = True의 목록을 사용하지 않는 경우 출력을 파일로 리디렉션하여 파일에 저장해야합니다. 명령은 다음 인수 stdout 삭제 인수의 순서를 변경하고, 목록 대신 문자열을 전달, 명령 줄에서 작동이 명령에 동작을 재현하게하기에 충분해야한다 가정하면

import os 
from subprocess import check_call 
pt1 = os.path.expanduser("~/mrjobScript.py") 
pt2 = os.path.expanduser("~/jobs/{}/input/*".format(date) 

with open (os.path.expanduser("~/jobs/{}/output/output-{}.log".format(date,domain)),"w") as f: 
    subprocess.check_call(["python",pt1,"--domain",domain,pt2],stdout=f) 
+0

왜 날짜 형식을 지정합니까? 이것은 필요한 imho. 내 mrjobsscript는 날짜를 넘겨줍니다. – nottinhill

+1

@SirBenBenji 형식으로 무엇을 의미합니까? 나는 단순히 +/- –

+0

대신에 str.format을 사용하여 코드를 더 깨끗하게 만들고있다.'p = subprocess.check_output (""python ","- domain ", domainNoTld, pt1, pt2, stdout = f) 파일" /usr/lib/python2.7/subprocess.py ", check_output에있는 라인 565 raise ValueError ('stdout 인수는 사용할 수 없습니다. 재정의됩니다.') ValueError : stdout 인수를 사용할 수 없으면 재정의됩니다 .' – nottinhill