2015-07-21 60 views
1

我在我的系統上安裝了python 3,並且已將可執行文件的路徑添加到PATH中。當我在Windows PowerShell(win8.1)中插入python時,它運行正常,但是我想將PowerShell ISE用於它的高級功能。然而,在PowerShell ISE中運行python崩潰,並顯示以下日誌:Python解釋器在PowerShell中崩潰ISE

python : Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 24 2015, 22:43:06) [MSC v.1600 32 bit (Intel)] on win32 
In Zeile:1 Zeichen:1 
+ python 
+ ~~~~~~ 
    + CategoryInfo   : NotSpecified: (Python 3.4.3 (v...ntel)] on win32:String) [], RemoteException 
    + FullyQualifiedErrorId : NativeCommandError 

Type "help", "copyright", "credits" or "license" for more information. 
>>> 

(對不起它部分是德國)

我再不能進入任何東西,必須按Ctrl + C要回的PowerShell。

這裏有什麼問題?

+0

好的,謝謝你的深入解答,如果你不能把它作爲答案發布,我會接受它。 – Xaser

+0

我認爲這更適合[超級用戶](http://superuser.com)。你可以在那裏提問,並提供一個鏈接到新的問題? – eryksun

+0

也許一個mod可以在那裏移動問題? – Xaser

回答

2

PowerShell ISE不適用於運行典型的交互式控制檯程序,如python.exe。它隱藏控制檯窗口並將stdout重定向到管道。要在實踐中看到這個ISE運行以下命令:

python.exe -i -c "import ctypes; ctypes.windll.user32.ShowWindow(ctypes.windll.kernel32.GetConsoleWindow(), 5)" 

在控制檯窗口中輸入文字,你會看到在控制檯中迴盪輸入,但輸出會通過管道輸送到ISE。


下面是Windows console applications的一些簡要概述。 powershell.exe,cmd.exe和python.exe都是用作控制檯服務器(或主機)進程conhost.exe的客戶端的控制檯應用程序。主機進程創建窗口並運行典型的GUI事件循環。當您從GUI應用程序(如explorer.exe)運行python.exe時,Windows會執行一個新的conhost.exe實例,該實例會創建一個新的控制檯窗口。從另一個控制檯應用程序(如powershell.exe)運行python.exe時,默認行爲是繼承父級控制檯。

console API與連接的控制檯主機進行通信。許多功能(例如WriteConsole)需要handle來控制檯輸入或屏幕緩衝區。如果您連接到控制檯,則特殊文件CONIN$代表輸入緩衝區,CONOUT$是當前的屏幕緩衝區,CON可以參考,取決於它是否打開進行讀取或寫入。 (您可能在cmd.exe中看到過命令,例如copy con somefile.txt。)

Windows進程有三個用於標準I/O句柄的字段。對於控制檯進程StandardInput默認爲CONIN$的句柄,並且StandardOutputStandardError默認爲CONOUT$的句柄。 C運行時庫將使用文件描述符0,1和2作爲標準FILE streamsstdin,stdoutstderr打開這些文件。啓動進程時,任何標準句柄都可以設置爲打開的文件或管道。

雖然進程一次只能連接到一個控制檯,但多個進程可以連接到單個控制檯。但是,通常只有一個過程處於活動狀態。例如,對於powershell.exe,運行python.exe後,其主線程正在後臺等待python.exe退出。 (請注意,如果在python.exe中啓動另一個交互式控制檯進程然後退出,此執行模型會失敗,因爲現在shell和子進程都在競爭訪問控制檯。)