2017-03-19 3 views
0

두 장치를 내 PC에 연결하고 python 및 adb를 사용하여 명령을 실행하려고합니다. 명령 프롬프트에서 명령을 실행하면 문제가 없지만 파이썬 스크립트에 입력하면 오류가 발생합니다. 내가 grep 명령없이 동일한 코드를하려고하면, 그것은subprocess.check_output 명령을 실행하는 데 실패하지만 Windows에서 동일하게 작동합니다.

adb_ouput = check_output(["adb","devices","-l"]) 
작동

Usage: adb devices [-l] 
Command '['adb', 'devices', '-l', '|', 'grep', '"model"']' returned non-zero exit status 1 

:

from subprocess import check_output, CalledProcessError 
try: 
    adb_ouput = check_output(["adb","devices","-l","|", "grep", "\"model\""]) 
    print adb_ouput 
except CalledProcessError as e: 
    print e 

내가 오류 메시지는 이것이다 : 이 오류 모든 시간을 일으키는

정확한 출력을 제공합니다.

내가 Windows 명령 프롬프트에서 똑같이 해보았을 때 잘 동작한다. (창에서 사용하고 있기 때문에 grep을 FINDSTR로 바꾼다. 그리고 파이썬 스크립트에서도 똑같이하려고 시도했다. 'shell = 사실 '도없이)

예 :.

adb devices -l | FINDSTR "model" 

이 나에게 어떤 문제없이 ouptut을 제공합니다. 내가 얻을 출력은

123ab6ef 장치 제품 : XXXXXXXXX 모델 : XXXXXXXXX 장치 : XXXXXXXXX

bd00051a4 장치 제품 : YYYYYYYYYY 모델 : YYYYYYYYYY 장치 : 내가 어디에 이해하려고 노력하고 YYYYYYYYY

나는 여기서 잘못 가고 있지만 그것을 이해할 수는 없다. 지금까지 문서를 확인했습니다 : https://docs.python.org/3/library/subprocess.html https://docs.python.org/3/library/subprocess.html#subprocess.CalledProcessError 다음은 오류 코드입니다.

다음 답변도 살펴 보았습니다. Python, adb and shell execution query 여기에서 오류를 검사하고 제 코드에 추가했습니다. python check_output fails with exit status 1 but Popen works for same command

Python subprocess.check_output(args) fails, while args executed via Windows command line work OK

나는 내가 가까이 모르지만, 그냥 내 손가락을 넣지 수 있다고 생각합니다. 도움이 될 것입니다.

답변

2

먼저

adb_ouput = check_output(["adb","devices","-l","|", "grep", "\"model\""]) 

확실히 shell=True이 필요하지만, 당신이 "model"grep로 인수 그대로 전달하는 check_output를 사용하지만 당신은 단지 model을 통과해야하는 경우도 그와는

adb devices -l | FINDSTR "model" 

에 해당 아니다 . "model"은 출력에 나와 있지 않으므로 grep은 찾을 수 없으며 grep의 오류는 아니지만 check_output0을 예상하므로 check_output이 예외를 트리거하게 만듭니다 (종료 코드 1).

adb_ouput = check_output(["adb","devices","-l","|", "grep", "model"],shell=True) 

을 그리고 longfix으로 파이썬으로 직접 grep 명령을 수행 할 것 :

그래서 나는 quickfix로이에 대한 것입니다.

adb_output = check_output(["adb","devices","-l"]) 
for l in adb_output.splitlines(): 
    if "model" in l: 
     print(l) 
+0

따옴표없이 시도했지만 실패합니다. grep을 사용하는 대신 python으로 출력을 필터링하는 중입니다. 답변 해주셔서 감사합니다. –

+0

왜 작동하지 않는지 이해할 수 없지만 어쨌든 두 번째 솔루션이 더 좋습니다. 'grep '을 가지고 있지 않은 머신에 이것을 두는 것을 상상할 수도 있습니다. –