2017-12-14 36 views
0

다른 파이썬 파일을 받아 들일 수 있고 하위 프로세스로 실행할 수있는 기본 파이썬 프로젝트가 있습니다. 기본 프로젝트는 사용자 입력을 받아들이고 하위 프로세스로 전달한 다음 코드를 실행하고 stdout을 통해 값을 반환합니다.이 값은 사용자에게 다시 입력됩니다. 나는 비슷한 일을하고있어 기본 프로그램에서 파이썬 하위 프로세스 제어 출력

: 서브 프로세스의 다음

dataReturnValue = subprocess.check_output(['python', pythonScriptPath, json.dumps(inputParams)]) 

나는 이런 일이 : 데이터가 올바르게 반환됩니다

inputParams = sys.argv[1] 
... 
... 
sys.stdout.write(returnValue) 

을하지만, 내가 뭘 ' d는 반환 된 데이터를 returnValue로 제한해야합니다. 지금은 서브 프로세스와 리턴 값을 포함한 모든 print 서술문을 반환합니다. 이것은 출력 형식이고 인쇄물은 stdout 래퍼와 비슷하기 때문에 나에게 의미가있다. 그러나 나는 이것을 더 잘 제어하고 싶다.

하위 출력에서 ​​반환 된 값에 포함 된 출력 또는 출력이 없도록 최종 출력 명령문 바로 전에 stdout 버퍼를 지우는 방법이 있습니까?

편집 : 마지막 호출 직전에 sys.stdout.buffer.flush(), sys.stdout.flush()를 시도해 보았습니다 최종 반환 값과 함께 전송 된 것처럼 보입니다.

+0

파이썬 스크립트라면'subprocess'를 사용하는 것이 가장 좋은 방법은 아닙니다. 이 접근법에 전념한다면 분리 기호 인 센티널 값을 인쇄하는 것이 좋습니다.'print'('SENTINEL', end = '')'그리고 나서'value = dataReturnValue.split ('SENTINEL') [- 1]'을 실행하십시오. -하지만 실제로 스크립트를 가져 와서 함수를 호출하는 것이 이상적입니다. . – sytech

답변

1

이 시도는 당신을 위해 데코레이터로 만들었습니다.

import sys 
import os 

def silence(func, *args, **kwargs): 
    def wrapper(*args, **kwargs): 
     with open(os.devnull, 'w') as sys.stdout: 
      result = func(*args, **kwargs) 
     sys.__dict__['stdout'] = sys.__stdout__ 
     return result 
    return wrapper 

이런 모든 기능에 그것을 사용

def test1(): 
    print("TEST1") 

@silence 
def test2(): 
    print("TEST2") 

def test3(): 
    print("TEST3") 

test1() 
test2() 
test3() 

는 출력 :

TEST1 
TEST3 
+0

으로 나눌 수 있습니다. 실제로이 오류는 반환되지 않지만 마지막으로 stdout을 사용할 수 있기 때문에 출력이 반환되지 않습니다. 출력 호출 –

+0

나는 stdout 버퍼를 열고 닫는 것을 망쳐 버리는 것은 주 프로세스와 서브 프로세스 사이에 전달 된 모든 참조를 망쳐 놓을 것이라고 염려한다. –

+0

나는 그것을 처리하기 위해 편집했다. 그게 당신에게 효과가 있는지 알려주세요. –

0

이 당신이 찾고있는 해답이 될 않을 수도 있지만 아마도이 가능한 해결 방법입니다 : 나는 심지어

:

import sys 
import os 

# Your code here 

with open(os.devnull, 'w') as sys.stdout: 
    # Code that you don't want to be printed here 
sys.stdout = sys.__stdout__ 

# Your code here 

편집 :

dataReturnValue = dataReturnValue.split("\n")[-1]

+0

이 간단한 해결 방법으로, 적어도 단순한 출력,하지만 난 정말 원하는 데이터를 반환합니다 원하는 경우에만 원하는 출력 및 모든 그것의 세그먼트를 반환합니다. 아마 약간의 변화로 생각해 봤는데 아마도 특정 키를 데이터 출력 앞에 붙이면 –

0

이 당신을 도울 수있을 수 있습니다.

당신은 하위 프로세스는 popen, 여기에 여러 개의 서브 프로세스 인스턴스를 사용하여 출력을 제어하는 ​​방법 링크

Python subprocess: how to use pipes thrice?

가하고자하는 당신의 task.if을 할 수있는 파이프를 사용할 수 있습니까? 명령 아래

(더미 명령) 라인 (100)을 생성,하지만 난 당신이 아니라 당신은 즉 Appium 시작 원 선을 얻을 텍스트 결국

from subprocess import Popen,PIPE 
command='appium-p 4723' 
p1=Popen(command,stdout=Pipe) 

return_value= 'Started Appium' 

#this will store the output which command generated 
output = p3.communicate()[0] 

for line in output: 
    if returnvalue in line: 
     print line 
    else: 
     pass 

'을 Appium 시작'이 하나의 라인이 필요합니다