在 Windows 上的 CygWin 下调用 python 挂起

Posted

技术标签:

【中文标题】在 Windows 上的 CygWin 下调用 python 挂起【英文标题】:Invoking python under CygWin on Windows hangs 【发布时间】:2012-11-15 07:45:23 【问题描述】:

安装新的Windows系统,我已经安装了CygWin和64 在默认位置(c:\cygwinc:\Python27\python),并添加了 CygWin bin 和 Python 目录到我的路径(在用户变量 PATH 中)。从 在正常的命令窗口中,Python 可以完美启动,但是当 我在 CygWin 环境中从 bash 调用它,它挂起, 从不给我输入提示。

我以前在其他机器上做过这个,但总是用 旧版本的 Python(32 位)和 CygWin,以及 Python 在一个绝对非标准的位置。有没有其他人有这个 问题,或者有人可以告诉我这可能是什么原因吗?

【问题讨论】:

非常相似:windows - Python not working in the command line of git bash - Stack Overflow 【参考方案1】:

问题在于,由于 Cygwin 终端 (MinTTY) 的行为方式,Python 的原生 Windows 构建没有意识到 stdout 是终端设备——它认为它是一个管道,所以它运行在非交互模式而不是交互模式,它完全缓冲其输出而不是行缓冲。

这是新的原因很可能是因为在您之前的 Cygwin 安装中,您没有 MinTTY,并且使用的终端只是标准的 Windows 终端。

为了解决这个问题,您要么需要从常规 Windows 终端 (Cmd.exe) 运行 Python,要么安装 Cygwin 版本的 Python,而不是 Python 的原生 Windows 版本。 Cygwin 版本(可通过 Cygwin 的 setup.exe 以软件包形式安装)理解 Cygwin 终端并在通过 MinTTY 运行时适当地运行。

如果你想要的特定版本的 Python 没有 Cygwin 包,那么你也可以下载 Python 的源代码并在 Cygwin 下自己构建它。如果您还没有 Cygwin 编译器工具链(GCC),您将需要它,但我相信它应该使用标准的 ./configure && make && make install 命令编译。

【讨论】:

+1 - 从 Windows Python27 切换到 Cygwin Python32 也解决了我遇到的这个问题。 谢谢。我无法更改 Python 的版本(不安装 2 个版本,一个用于 CygWin,一个用于其他所有版本),因为它是我们生产构建链的一部分。但是python -i 有效,在.bashrc 中创建别名可能是一个可以接受的解决方案。 This answer 还提供了一些我以前不知道的建议——使用-u 命令行开关运行Python 或设置环境变量PYTHONUNBUFFERED=1 将改变Python 的缓冲行为。跨度> 【参考方案2】:

根据https://***.com/a/9549255/745913你也可以试试

/cydrive/c/Python27/python.exe -i foo.py

【讨论】:

【参考方案3】:

试试这个

python -i

是的,你会在这里和那里发现一些小故障!!!

选项 -i 强制交互式提示,如 Python 帮助 python -h 页面所示。​​

$ python -h
-i  : inspect interactively after running script; 
      forces a prompt even if stdin does not appear to be a terminal;
      also PYTHONINSPECT=x

【讨论】:

这很好用。最好在答案中添加一些关于python -i 选项的信息,这样其他人就不需要做python -h 来弄清楚了。【参考方案4】:

我在使用 Mercurial (hg)+OpenSSH、Python 和 MinTTY 时遇到了类似的问题,但使用的是 MSYS 而不是 CygWin。尽管如此,据我所知,这和我的问题都是由 MinTTY 没有处理使用本机 Windows 控制台功能的应用程序引起的(在 Adam 的回答中,他详细解释了 Python)。

对我来说,我遵循https://code.google.com/p/mintty/issues/detail?id=56#c64 的第 64 条评论中的解决方案

通过编译 winpty (https://github.com/rprichard/winpty) 项目并在我的路径中,我能够从 MinTTY shell 运行 native Python(以交互模式)和 Mercurial,而无需特殊构建或开关(例如如python -i)。我只需要在pythonhg 命令之前附加console.execonsole。为方便起见,我添加了诸如 alias hg="console.exe hg" 之类的别名,这样无论我是在 Linux shell 还是 Windows MinTTY bash shell 中,我都可以使用相同的命令。

此外,此解决方案似乎适用于除 python 和 hg 之外的更多本机应用程序。例如,运行mysql(有或没有-p)会出现同样的问题(例如“挂起”而没有输入提示)。将console 附加到它允许它像往常一样。

【讨论】:

终于得到了 50 点声望点来说声谢谢!。虽然“-i”在大多数情况下都有效,但我们的实验室软件主要运行 cygwin,但随后调用 windows python,因为它需要 ctypes.WinDLL。这个 win 调用有一个嵌入的 ipython 提示符,并且在 mintty 上被彻底搞砸了(标签/箭头不起作用,都是愚蠢的)。这是最简单和最好的解决方案——就像一个魅力。在 bash 脚本中,刚刚做了“console.exe C:\Python27\python.exe”,现在嵌入 ipython 效果很好!正在拔头发,因为在 64 位 Windows 上,mintty 只是镇上的终端游戏。 不确定python -i 是如何实际更改终端缓冲和读取单个字符的。它一定在做一些聪明的事情。无论哪种方式,winpty 都是我的 Python 脚本 的方式,它并不那么聪明。 应该添加winpty的可执行文件名现在已经从console.exe更改为winpty.exe【参考方案5】:

用于在 CygWin 中管理不同 Python 版本的非 cygwin 位置:

$ /usr/sbin/alternatives.exe

在此处使用 --install 和 --config 选项,它与 Linux 系统上的update-alternatives 相同。 我将它与python -i 方法一起使用,效果很好。

我还必须删除/usr/binfirst 中的符号链接文件,因为它们是使用 CygWin 的 python 安装的,并且最初不是通过 Alternatives.exe 管理的。

【讨论】:

【参考方案6】:

我的解决方案是编写一个 shell 脚本来运行 python 应用程序。

python file.py "$@" | tee /dev/null

那个额外的 tee 命令(无处可去)似乎解决了这个问题。

【讨论】:

【参考方案7】:

另一个通用的解决方法是通过winptyhttps://github.com/rprichard/winpty 调用它,这并不是真正的python 特定问题。

【讨论】:

【参考方案8】:

使用 cygwin 安装程序重新安装 mintty。之后不必使用 python -i。

【讨论】:

以上是关于在 Windows 上的 CygWin 下调用 python 挂起的主要内容,如果未能解决你的问题,请参考以下文章

Windows 下安装 swoole 具体步骤

Windows 下安装 swoole 具体步骤(php)

如何在 Windows 上的 Cygwin 中运行 crontab?

Windows 下安装 swoole 具体步骤(转)

swoole安装

如何在windows bat脚本中调用Cygwin并执行命令