2013-11-28 2 views
1

서브 프로세스를 사용하여 다른 로컬 스크립트를 호출하려고합니다.다른 파이썬 스크립트 main()을 호출하고 STDOUT 결과 얻기

로컬 스크립트는 그 결과를 화면에 인쇄합니다. 지역

:

def main(): 
    """ 
     main function 
     controls the method call, the method is decided by TS runner 
    """ 

    sParams = ScriptParamHandler() 
    paramsList = ['TestName'] # ordered list of parameters 
    paramsDict = sParams.AnalyzeParametersForScript(paramsList) 

    mainReturn = None 

    with ProductXXXXX() as testSequence: 

     testSequence.testFixture.InitDevices() 

     func = getattr(testSequence, paramsDict['TestName']) 

     returnVal = func() 

     print paramsDict['TestName'], "\n", returnVal, "\n" 

if __name__ == "__main__": 
    main() 

발신자 스크립트 :

with BasicRunner(testSet, testSetLocation, paramsDict['ProfileName']) as testRunner: 

    if testRunner.CheckFolderAndFile(): 

     testRunner.GetProfile() 

     for test in testRunner.testList: 

      testRunner.logger.Info("Test {} started...".format(test)) 

      testResult = subprocess.call(testRunner.tsPyFile + " " + test, shell=True) 

      testRunner.logger.Info("Test {} result {}".format(test, testResult)) 

    else: 

     pass 

나는 발신자 스크립트 testResult 로컬 스크립트의 stout되고 싶어요.

나는 stdout=subprocess.PIPEsubprocess.check_output()을 사용해 보았지만 운이 없다면 어떤 사람들은 나에게 더 나은 방향을 줄 수 있을까?

+2

당신이 testResult.communicate을 (시도 않았다 그러나 여기 check_output() 변형은 그것을 할 수있는 방법을 보여주기 위해입니까? (with stdout = subprocess.PIPE ofcourse) – shshank

+0

스크립트가 동일한 파이썬 프로세스 내에서 실행될 때 stdout을 리디렉션 할 수도 있습니다. 하위 스크립트가 외부 서브 프로세스, C 확장 라이브러리 등의 출력과 같이 비 Python 출력을 생성하는 경우에는 더 복잡합니다 (https://gist.github.com/zed/991e006c822740aa6896#file-parent-py). – jfs

답변

2

,이 솔루션입니다. 대신 subprocess.check_output의())

import sys 
from subprocess import check_output, STDOUT, CalledProcessError 

try: 
    stdout_value = check_output(
     [sys.executable or 'python', testRunner.tsPyFile, test], stderr=STDOUT) 
except CalledProcessError as e: 
    stdout_value = e.output 
+1

[my answer] (http://stackoverflow.com/a/20278271/4279)에서 언급했듯이, 하위 스크립트가 알려진 경우'.communicate()'는'check_output()'보다 낫습니다. 실패 할 수 있습니다. 당신은 아마 당신 자신의 대답을 받아 들여야합니다. – jfs

1

plumbum을 사용하는 것이 좋습니다. 그것은 당신의 삶을 훨씬 더 쉽게 만들어 줄 것입니다.

proc = subprocess.Popen(['python', testRunner.tsPyFile, test], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 
stdoutValue = proc.communicate()[0] 
+0

+1 좋은 옵션, 그것에 대해 몰랐습니다. –

1

.communicate() is the way이 실패 할 수 있습니다 또 다른 파이썬 스크립트에서 표준 출력/표준 에러 병합하려면 : @shshank 코멘트에 의해 해결

from plumbum.cmd import python 
stdout = python[testRunner.tsPyFile][test]()