2012-07-05 3 views
1

파이썬에서 외부 실행 코드를 실행하고 출력을 사용하려고합니다. 사용중인 코드에서 외부 파일을 사용하고 단일 번호 (인코딩 된 이미지의 수 그 파일). 3962 내가 파이썬 내에서 하위 프로세스를 사용하려고하면 내가 얻을, 그러나파이썬 하위 프로세스와의 혼동

말할 수있는만큼 근처 올바른 출력이다

[email protected]:~/nist/hsfsys/bin$ ./nummis /usr/local/hsfsys/data/by_class/4a/train_4a.mis 
3962 

: 나는 명령 줄에서 실행하면, 나는 다음을 참조 다음 오류 :

[email protected]:~/nist/hsfsys/bin$ python 
Python 2.7.3 (default, Apr 20 2012, 22:39:59) 
[GCC 4.6.3] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import subprocess 
>>> subprocess.check_output(["./nummis","/usr/local/hsfsys/data/by_class/4a/train_4a.mis"]) 
Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
File "/usr/lib/python2.7/subprocess.py", line 544, in check_output 
raise CalledProcessError(retcode, cmd, output=output) 
subprocess.CalledProcessError: Command '['./nummis', '/usr/local/hsfsys/data/by_class/4a/train_4a.mis']' returned non-zero exit status 32 
>>> subprocess.call(["./nummis","/usr/local/hsfsys/data/by_class/4a/train_4a.mis"]) 
3962 
32 

"0이 아닌 종료 상태 32"를 어떻게 해석해야합니까? 무엇인가 잘못 되었다면 커맨드 라인에서 그것을 보지 않겠습니까? 아무 문제가 없다면, 왜 파이썬은 & 불평을 멈추게 할 수 있습니까?

+0

표시되는 동작은 .check_call() 하위 프로세스에 대해 설명 된 것과 같습니다. 두 가지 주요 옵션이 있습니다 : 예외 처리기에서 호출을 감싸거나, subprocess.Popen을 사용하여 처리합니다. check_output()은 일부 .Popen() 코드를 감싸는 래퍼입니다. 다른 방법은 다소 복잡하지만이 방법은 [ '/ bin/sh', '-c', 'your_command your_args; exit 0 '] 명령이 리턴하는 것과 상관없이 서브 프로세스가 강제로 0을 리턴하게하십시오. 그러나 그것은 어리석은 짓입니다. ("nummis"명령을 다시 써서 EXIT_SUCCESS를 적절히 반환 할 수도 있습니다.) –

+0

@Dim Dennis Thanks. p = subprocess.Popen (....., stdout = subprocess.PIPE) 다음에 z = p.communicate()를 사용하면 원하는 결과물에 액세스 할 수있었습니다. – user1245262

답변

2

명령 줄은 명시 적으로 요청할 때 종료 상태 만보고합니다.

명령 줄에서 프로그램을 호출 한 후, 종료 상태를 보여주기 위해

echo $? 

을 시도합니다. 32이 표시되면 유죄 인 프로그램입니다. main()에 올바르게 return 0; 또는 return EXIT_SUCCESS;이 아닙니다.

+0

echo $? /usr/include/asm-generic/errno-base.h에 따라 32를 보여줍니다. 깨진 파이프가 있음을 의미합니다. 감사. – user1245262

+0

@ user1245262이 조회는 프로그램이 명시 적으로'errno'의 값을 반환하는 경우에만 유효합니다. 그렇지 않으면 반환 코드가 의미하는 것은'nummis' 프로그램 자체에 달렸습니다. – glglgl