2012-07-05 143 views
1

我試圖從Python內部運行一些外部可執行代碼,然後利用輸出。我使用的代碼需要一個外部文件並返回一個單一數字(編碼的圖像數量該文件)。當我在命令行中運行,我看到以下內容:與Python子進程混淆

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

其中3962是一個正確的輸出儘可能接近我可以告訴

然而,當我嘗試使用子從內Python中,我得到出現以下錯誤:

[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 

我該如何解釋此「非零退出狀態32」?如果有什麼不對,我爲什麼不在命令行上看到它?如果沒有錯,爲什麼Python抱怨&我怎麼才能讓它停止抱怨?

+0

您看到的行爲與子進程.check_call()函數相同。我猜你有兩個主要選擇:將你的調用包裝在異常處理程序中,或者使用subprocess.Popen並提供你自己的處理(check_output()是一些.Popen()代碼的包裝)。 另一個相當複雜的方法是調用['/ bin/sh','-c','your_command your_args;退出0']強制子進程返回零,不管你的命令返回什麼。但那真是太傻了。 (你也可以重新編寫「nummis」命令來返回EXIT_SUCCESS) –

+0

@Jim Dennis謝謝。使用p = subprocess.Popen(.....,stdout = subprocess.PIPE),然後是z = p.communicate(),可以訪問我想要的輸出。 – user1245262

回答

2

命令行僅在顯式詢問它時報告退出狀態。

從命令行調用程序後,嘗試

echo $? 

,以示退出狀態。如果它也顯示32,它是有罪的被調用程序。它的return 0;return EXIT_SUCCESS;在其main()中不正確。

+0

echo $?顯示32,根據/usr/include/asm-generic/errno-base.h。意味着有一個破損的管道。謝謝。 – user1245262

+0

@ user1245262如果程序顯式返回'errno'的值,則此查找只有有效。否則,它取決於程序'nummis'本身的返回代碼的意思。 – glglgl