Python解释器在Powershell ISE中崩溃

时间:2015-07-21 19:55:57

标签: python windows powershell powershell-ise

我的系统上安装了python 3,并且已将可执行文件的路径添加到PATH中。当我在Windows PowerShell(win8.1)中python之间它运行良好,但是我想使用PowerShell ISE来获得它的高级功能。但是,在PowerShell ISE中运行python会崩溃并显示以下日志:

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。

这可能是什么问题?

1 个答案:

答案 0 :(得分: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 streams stdinstdoutstderr打开。当启动任何标准的进程时句柄可以设置为打开的文件或管道。

虽然进程一次只能连接到一个控制台,但可以将多个进程连接到单个控制台。但是,通常只有一个进程处于活动状态。以powershell.exe为例,运行python.exe后,其主线程在后台等待python.exe退出。 (请注意,如果在python.exe中启动另一个交互式控制台进程然后退出,则此执行模型会严重失败,因为现在shell和子进程都在竞争访问控制台。)