我的系统上安装了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。
这可能是什么问题?
答案 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$
的句柄,StandardOutput
和StandardError
默认为CONOUT$
的句柄。 C运行时库使用文件描述符0,1和2将它们作为标准FILE
streams stdin
,stdout
和stderr
打开。当启动任何标准的进程时句柄可以设置为打开的文件或管道。
虽然进程一次只能连接到一个控制台,但可以将多个进程连接到单个控制台。但是,通常只有一个进程处于活动状态。以powershell.exe为例,运行python.exe后,其主线程在后台等待python.exe退出。 (请注意,如果在python.exe中启动另一个交互式控制台进程然后退出,则此执行模型会严重失败,因为现在shell和子进程都在竞争访问控制台。)