2016-07-25 5 views
0

나는 유트 라인을 잡고 쉘 스크립트에이 문자열을줍니다. 직렬 입력 줄을 잡고 쉘 스크립트로 옮깁니다

#!/usr/bin/env python 
import os 
import serial 

ser = serial.Serial('/dev/ttyAMA0', 4800) 
while True : 
try: 
    state=ser.readline() 
    print(state) 
except: 
    pass 

그래서, "상태"이제 쉘 스크립트에 제공한다, 같은 : myscript.sh "This is the serial input..." 하지만이 어떻게 할 수 있습니까?

print(os.system('myscript.sh ').ser.readline()) 

이 작동하지 않습니다.

+0

'os.system()'은'print'하고 싶은 것을 돌려주지 않습니다. 하위 프로세스가 표준 출력에 아무 것도 인쇄하지 않으면 그 곳으로 가고 Python 스크립트는 알 수 없습니다. 하위 프로세스가 인쇄하는 것을 캡처하려면,'check_output' 메소드 (Python 2.7+) – tripleee

답변

0

단순한 문자열 연결이 os.system 함수에 전달됩니다.

import os 
os.system("myscript.sh " + ser.readline()) 
0

os.system를 사용하여 실행하는 당신에게 전체 명령을 줄 것이다 두 개의 문자열 (즉 "./myscript.sh"ser.readLine())를 결합하는 여러 가지 방법이 있습니다. 예 : 문자열은 string.format 방법의 인수가 될 수 있습니다

os.system('myscript.sh {}'.format(ser.readline())) 

은 또한이 두 문자열을 추가 할 수 있습니다

os.system('myscript.sh '+ser.readline()) 

난 당신이 print 문을 달성하기 위해 원하는 것을 확실하지 않다. 코드의 호출 및 입출력을 처리하는 더 좋은 방법은 os에서 subprocess module으로 전환하는 것입니다.

+0

을 사용하는 대신'subprocess' 모듈을 살펴볼 또 다른 이유가 있습니다. 인쇄 명령은 직렬 읽기를 테스트하기위한 것입니다. – dokle

+0

@dokle 잘 알고 있습니다. 내가 도울 수 있으면 좋겠다 ... – jotasi

+0

나를 위해 일한 덕분에 – dokle

0

myscript이 지속적으로 추가 입력을 읽을 수 있으면 파이프 라인이 훨씬 효율적입니다.

from subprocess import Popen, PIPE 
sink = Popen(['myscript.sh'], stdin=PIPE, stdout=PIPE) 
while True: 
    sink.communicate(ser.readline()) 

당신은 모든 입력 라인에 대한 새로운 myscript.sh을 시작해야하는 경우, 물론, 당신이 할 수있는 (당신이 정말로 당신의 디자인을 재고하기를 원하지만 것이다) : 모두 얼마나

while True: 
    subprocess.check_call(['myscript.sh', ser.readline()) 

공지 사항 사례는 avoid a pesky shell입니다.

+0

고마워, - 네, 하루에 몇 줄 밖에 없으므로 각 입력 줄에 새 스크립트를 시작하겠다. 그리고 나는 프로세스 스크립트를 변경할 필요가있다. , read-line 프로세스를 방해하지 않고 5 년 전부터 두 개의 스크립트를 작성하기로했습니다. 하나는 읽기 용이고 다른 하나는 라인 테스트 용입니다. 그러나 읽기 용 쉘 스크립트는 새로운 hw (pi 3)에서 작동하지 않으므로 지금은 새로운 "읽기"스크립트를 찾고 있습니다. – dokle

+0

나는 파이프 라인을 최대한 빨리 시험해보고 싶다. 고마워. – dokle