2016-07-21 7 views
0

다른 파이썬 스크립트를 다른 디렉토리에서 호출하는 파이썬 스크립트가 있습니다.하위 프로세스를 사용하여 인수가있는 파이썬 스크립트 호출

import os 
import subprocess 

arg_list = [project, profile, reader, file, str(loop)] 

f = open(project_path + '/log.txt','w') 
proc = subprocess.Popen([sys.executable, python_script] + arg_list, stdin=subprocess.PIPE, stdout=f, stderr=f) 
streamdata = proc.communicate()[0] 
retCode = proc.returncode 
f.close() 

묵시적으로 변환이 부분 때문에 내가 호출 된 스크립트에서 발생하는 오류를 볼 수있는 로그 파일의 잘 작동하지 않을 경우 모든 인수는 문자열입니다 : 내가 subprocess.Popen을 사용하는 것을해야 할 일 .

import time 
import csv 
import os 

class loading(object): 

    def __init__(self, project=None, profile=None, reader=None, file=None, loop=None): 
     self.project=project 
     self.profile=profile 
     self.reader=reader 
     self.file=file 
     self.loop=loop 

    def csv_generation(self):  
     f=open(self.file,'a') 
     try: 
      writer=csv.writer(f) 
      if self.loop==True: 
       writer.writerow((self.project,self.profile,self.reader)) 
      else: 
       raise('File already completed') 
     finally: 
      file.close() 
def main(): 
    p = loading(project, profile, reader, file, loop) 
    p.csv_generation() 

if __name__ == "__main__": 
    main() 

내가 subprocess.Popen을 시작할 때, 나는 'project' is not defined 말해 호출 된 스크립트에서 오류가 있습니다 : 여기라는 파이썬 스크립트입니다. Popen 메서드는 해당 스크립트에 인수를 전달하지 않습니다. 내가 뭔가 잘못하고있는 것 같아요, 누군가 생각이 있어요?

+0

왜 '서브 프로세스'를 사용하고 있습니까? 왜 그냥 '가져 오기'하지 않고 적절한 기능을 직접 호출할까요? – jonrsharpe

+0

@jonrsharpe 왜냐하면 하위 프로세스에 의해 호출되는 스크립트가 매번 달라지기 때문입니다. 따라서 종속성은 동일합니다. 게다가이 스크립트는 서브 프로세스를 사용하는 것과 같은 파이썬 프로젝트에 있지 않습니다. –

+0

스크립트의 이름으로 가져올 수 있습니다. 문제는 없습니다. 그리고 문제가되어서는 안되는 동일한 기계에 둘 다 설치되어 있다면, "같은 파이썬 프로젝트가 아닌"*이 ​​의미하는 것이 명확하지 않습니다. – jonrsharpe

답변

2

새 프로세스에 매개 변수를 전달하면 해당 매개 변수가 위치 적으로 전달되고 상위 프로세스의 이름은 값만 남게됩니다. 우리는 (첫 번째 요소는 프로그램의 이름이다) 할당하기 전에 sys.argv의 길이를 테스트

import sys 
def main(): 
    if len(sys.argv) == 6: 
     project, profile, reader, file, loop = sys.argv[1:]  
    else: 
     raise ValueError,("incorrect number of arguments") 

    p = loading(project, profile, reader, file, loop) 
    p.csv_generation() 

: 당신은 추가해야합니다.