2015-07-21 146 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和子进程都在竞争访问控制台。)