2017-12-20 14 views
0

저는 직장에서 사용되는 일련의 스크립트를 자동화하는 문제를 해결하려고합니다. 나는 초보자이기 때문에 쉬운 질문 일 가능성이 높다고 사과한다. (잘하면) 문학을 읽었지 만 나에게 의미가 없다.os.wait()의 올바른 사용?

본질적으로 나는 python 스크립트와 R 스크립트를 실행하는 bash 스크립트를 가지고있다.이 스크립트는 현재 실행해야하는 R 스크립트이며, R 스크립트는 Python이 끝나기 전에 시작되어 내가 사용할 수없는 것보다 여기까지 들었다. 내 파이썬 스크립트와 같은 쉘 대기 함수는 자식 프로세스를 시작하고 쉘 대기는 손자 프로세스를 기다리는 데 사용할 수 없습니다.

그렇기 때문에 제공되는 솔루션은 파이썬과 R 스크립트가 자신의 하위 프로세스에서 대기하게하여 종료 할 때 bash 스크립트가 올바르게 실행될 수 있도록합니다. 불행히도 나는 파이썬 스크립트에서이 적절한 명칭을 알아낼 수 없다.

'입력'내 코드에 실제 입력을하다
cmd = "python %s/create_keyfile.py %s %s %s %s" %(input, input, input, 
input, input)  
print cmd 
os.system(cmd) 

cmd = "python %s/uneak_name_plus_barcode_v2.py %s %s %s %s" %(input, 
input, input, input, input) 
print cmd 
os.system(cmd) 

cmd = "python %s/run_production_mode.py %s %s %s %s %s" %(input, input, 
input, input, input, input) 
print cmd 
os.system(cmd) 

, 나는 아마 캔트 주 우리가 그래서 본질적으로 내가 그림을 시도하고있다 :

을하고 정확히 : 여기

내가 가진 무엇 끝내기 전에이 세 스크립트에서 전체 스크립트를 기다리는 것이 가장 좋은 방법입니다.

편집 : 도와 주신 모든 분들께 감사 드리며, 여기에 어떤 사람이 내 Google 검색을위한 딜레마를 불러 일으켰습니다. 나는 시간 가져 오기 sleep에서 "python -c"를 삽입하는 것으로 결정했다; sleep (30) ""내 코드에 처음 두 개의 파이썬 스크립트가 예상대로 대기하고 있었고 마지막 하나는 없었습니다 (타이머가 스크립트가 실행 된 후 즉시 트리거됩니다). 세 번째 파이썬 스크립트는 다른 작은 파이썬 스크립트 그 끝에 "&"이 있었는데 그 명령을 기다리는 명령은 무시되었습니다. 단순히 이것을 제거하면 &은 모든 코드를 순차적으로 실행할 수있었습니다.

+1

os.system()은 이미 차단 호출이며, 이는 완료 될 때까지 이미 리턴하지 않는다는 것을 의미합니다. 파이썬 스크립트가 대몬을 모욕하지 않는다면, 부모는 자식을 차단하기 전에 종료해야합니다. 그들이 daemonize한다면, ps 나 top으로 프로세스를 체크해야 할 것입니다. 나는 문제가 실제로 백그라운드에서 스크립트를 실행하는 BASH 스크립트에 있다고 추측합니다. python -c "from time import sleep; sleep (30)"그러면 bash 스크립트는 90 초가 걸릴 것입니다. – sehafoc

+0

BTW,'shell = True'가 위험한 이유에 대한 https://docs.python.org/2/library/subprocess.html#frequently-used-arguments의 경고를 참조하십시오. ** 모든 ** 메소드에 적용됩니다. 'os.system()'이 동일한 위험을 겪고 있다는 것을 의미하며 (같은 이유로 사용되어서는 안됨) 부모와 그 의도 된 자식 사이에 쉘을 삽입하는 서브 프로세스를 호출하는 것입니다. –

+0

... 구체적으로 :'input's에'$ (rm -rf ~)'가 포함되어 있다면 - 쉘에 의해 실행되는 것을 원하지는 않습니다. 당신의'% s' 자리 표시 자 대신에 사용됩니다. –

답변

0

사용 subprocess.check_call()하지 os.system()

subprocess.check_call() 함수가 값을 반환 할 때까지 주 파이썬 스크립트의 실행을 차단합니다.

Documentation for check_call() here

서브 프로세스 모듈

항상 서브 프로세스 관리 및 실행 os.system() 대신 이용 될 것이다.

+0

이것은 일반적으로 좋은 충고이지만'os.system()'도 차단합니다. –

+0

... 말하자면,이 조언을 따르는 것이 어떤 문제를 해결할 수 있는지는 알지 못합니다. OP 질문은 합리적으로 묻는 것으로 해석 될 수 있습니다. –

+0

맞아,''os.system()''이 (가) 차단하고 있다는 사실을 잊어 버렸습니다. 몇 년 동안 그것을 사용하지 않았습니다. :) 감사 – seventyseven