2016-11-10 6 views
1

Modbus 통신을위한 CRC 값을 계산하려면 외부 응용 프로그램을 구현해야합니다. 실행 파일은 입력 문자열을 필요로하며, 같은 출력을 다시 제공합니다파이썬 하위 프로세스 .Popen이 stdout에서 작동하지 않습니다.

CRC16 = 0x67ED/26605 
CRC16 (Modbus) = 0x7CED/31981 

은 내가 programm에 전화를하고 이후에 수동으로 입력에 입력합니다.

p = Popen(["some_file.exe", "-x"], stdin=PIPE) 
p.communicate("some_string") 

이것은 지금까지 문제가 없습니다.

그러나 출력을 변수 나 추가 파일이 아닌 다른 용도로 저장하려고합니다. 모든 일이

p = Popen([file, "-x"], stdin=PIPE, stdout=PIPE, stderr=PIPE) 

아무것도 입력하지 않을 때

나는 표준 출력과 표준 에러 인수가 알고 있지만.

누구에게 아이디어가 있습니까?

미리 감사드립니다.

PS : 윈도우 7

답변

1

에 파이썬 2.7을 사용하여이 LS의 출력을 얻을 표준 출력 = subprocess.PIPE을 사용합니다.

proc = subprocess.Popen('ls', stdout=subprocess.PIPE) 
output = proc.stdout.read() 
print output 

은 획득 : Pipe subprocess standard output to a variable

참고 :

당신이 예에서와 같이 값을 할당해야합니다 PIPE로 표준 입력 사용하는 경우 :

grep = Popen('grep ntp'.split(), stdin=PIPE, stdout=PIPE) 
ls = Popen('ls /etc'.split(), stdout=grep.stdin) 
output = grep.communicate()[0] 

값이 주어진다 경우 PIPE를 사용하는 콘솔에서, 표준 값을 지정해야합니다. sys.stdin

+0

답변 해 주셔서 감사합니다. 나는 모른다. 그러나 이것은 효과가없는 것처럼 보인다. 프로그래머에게 의견을 주어야하기 때문에'stdin = PIPE'가 필요합니다. 이 인수를 사용하는 것은 괜찮지 만'stdout = PIPE'를 추가하는 것은 쉽지 않습니다. 나는 변수'output = ... '에 쓸 수있는 지점까지 가지 않는다. – mulm

+0

@mulm'stdin = PIPE'를 사용하면 stdin에 값을 할당해야하며, 그렇지 않으면 null이된다. –

0

좋아, 알아 냈어.

그것은 이전 포스트에서 말한다 : 이 How do I write to a Python subprocess' stdin?

p.communicate() 그냥 다음과 같은 형태로 입력을 기다립니다 :

p = Popen(["some_file.exe", "-x"], stdout=PIPE, stdin=PIPE, stderr=PIPE) 
output = p.communicate(input="some_string")[0] 

다음 출력이 수신되는 모든 정보가 있습니다.