為什麼python代碼有時候在命令行下和Python Shell中執行的結果不一樣呢 ?

比如上例,同樣是使用ctypes類庫調用C語言中的printf功能,前者輸出的是需要輸出的對象,而後者卻輸出了字元串的長度。。。


這個例子非常有意思,無人邀請,我來答一下吧。

使用不熟悉的函數和library是危險的。

使用不熟悉的函數和library是危險的。

使用不熟悉的函數和library是危險的。

重要的話說三遍。

首先,先看這個例子,只是把helloworld.cpp 略加改動,題主覺得這個代碼應當輸出什麼結果?

#include &
#include &

using namespace std;

int main()
{
cout&<&

答案是這樣:

這告訴我們一個基本的事實,叫做C中的 printf 函數,實際上返回一個值,這個值代表了它輸出的字元的數目,注意是輸出的字元數目,而非參數的長度。

因此,當你使用script來運行代碼的時候,一切當然都是正常的,這是我的結果:

但是,當你使用interactive shell的時候,你得注意到一個基本的事實,那就是:

這個Python Shell的窗口,並不是cmd或者terminal!

實際上,shell輸出什麼,取決於他的實現,並不意味著一定會輸出代碼的結果。

你其實看到的輸出並不是stdout,而是Python向stdout中輸出的內容,因為idle中的顯示就是修改stdout來實現的。

為了再次說明這個道理,我把我的 Anaconda Python 的REPL的結果截圖放在這裡,來告訴你,code的結果,在cmd里是可以看到的。

========================== 2015-12-7 ===============================

感謝 @bhuztez@柯豪 @壯壯,之前的答案有錯誤,謝謝指出,我已經改正了。


首先,如上面 @柯豪 的答案所說,Shell的行為並不完全和Python代碼一致

&>&>&> for i in range(5):
... i
...
0
1
2
3
4

如上面的 @壯壯 答案所說,在Idle里運行,實際上你並不能看到標準輸出,你只能看到Python代碼往標準輸出里寫的東西,因為Idle里的輸出就是靠改sys.stdout實現的。這也就是為什麼還有 @Shawn Wu 里能在直接從命令行啟動的Python Shell里看到輸出。並不是因為這個Shell的實現不一致導致的。


主要是因為這東西變了.

而c庫中的標準的輸出沒改變.

具體可以看這個文章 http://eli.thegreenplace.net/2015/redirecting-all-kinds-of-stdout-in-python/


推薦閱讀:

Python 曾經開發過哪些了不起的程序或遊戲?
Python分析中文文字有哪些方法,那些庫?
會了django還有必要學flask嗎?
學習python有什麼好的視頻?
請問有哪些優秀Python課程推薦?

TAG:Python | 編程 | 命令行控制 | Python庫 |