我已经使用 Windows 二进制文件安装了 Python,因此我需要键入python -i
才能在 Cygwin 中启动 Python。退出时,我需要输入exit()
。这只是一个小问题,但我仍然想知道是否可以修复它,以便我可以Ctrl+Z
像在cmd
答案1
要在 Cygwin 中运行 Windows Python,总是这样做:
$ cygstart python
切勿这样做:
$ python -i
这也扩展到 Windows IPython。总是这样做:
$ cygstart ipython
切勿这样做:
$ ipython -i
不过,在我们探讨原因之前,我们先来谈谈${PATH}
。
Python 和${Path}
:终于在一起了!
上述答案假设python
您当前${PATH}
安装的是 Windows 原生版本,而不是 Cygwin 安装的 Python 版本。如果是后者,则必须将 Windows Python 的绝对路径明确传递给cygstart
。例如:
$ cygstart /cygdrive/c/Miniconda3/python.exe
如果你经常运行 Windows Python,那么你可能想要那您的权威python
。如果您安装了流行的 Python 发行版(例如 Anaconda、Miniconda、Enthought Canopy),这意味着您。为此,请在 shell 启动时(例如,在 中)${PATH}
添加包含目录的绝对路径。例如:python.exe
~/.bashrc
# Stash this somewhere.
export PATH="/cygdrive/c/Miniconda3:${PATH}"
python -i
或有什么问题cmd.exe
,Chummer?
当我发现另一个善意的建议时,它建议通过python -i
Cygwin 内部运行 Windows Python或者 python
在非 Cygwin 终端中,我只是摇摇头。
不不不。在这两种情况下,你都做错了。
python -i
在Cygwin 中运行时,你会失去正常的键盘绑定(例如,<向上> 和 <向下> 循环浏览 REPL 历史记录,<Ctrl-D> 终止 REPL) 并且也许更重要的是输出缓冲。
如果python
在非 Cygwin 终端中运行,您将失去 Cygwin。您使用 Cygwin 是有原因的 – 大概是因为您更喜欢 POSIX 兼容性以及所需的一切(例如,健全的 shell),而不是传统的 Windows 替代方案。
到底什么事情如此火爆cygstart
?
没有理由放弃 Cygwin。每一个但是,这样做的原因是要在 Cygwin 中将本机 Windows 应用程序(因此 Windows Python)作为本机 Windows 进程而不是与 POSIX 兼容的 Cygwin 进程来运行。但事实并非如此。
进入cygstart
。
这个标准的 Cygwin 实用程序(相当令人困惑)超载以各种略显有趣的方式与本机 Windows 应用程序、路径和 URI 进行交互。就我们的目的而言,cygstart
在当前运行中传递命令的名称会${PATH}
将该命令作为本机 Windows 进程运行,在 Cygwin 存在的情况下保留 Windows shell 语法和语义。
总结
本机 Windows 应用程序(包括 Windows Python 和 IPython)应该总是通过命令从 Cygwin 内部运行cygstart
。
答案2
这里的问题是 Cygwin 终端仿真器(MinTTY 等)与 Windows cmd 终端仿真器之间的差异,Cygwin 终端仿真器试图像 Linux 终端一样运行,以便使用原生 Cygwin 应用程序。由于 MinTTY 处理信号的方式不同,它不会将Ctrl+Z作为 EOF 信号传递给 Windows Python,而Windows Python 根本不处理Ctrl+ 。D
解决方案是坚持在 Windows 终端仿真器中使用 Windows Python(即 cmd 终端仿真器,它与您从“开始”菜单或类似菜单启动 Windows Python 时获得的终端仿真器相同),并安装 Cygwin Python 并从 Cygwin 终端仿真器使用它。这样,每个终端仿真器都会正确接收和处理相关信号。