在Python中使用管道脚本时无法启动交互式程序

我有一个需要调用定义的$EDITOR或$VISUAL的python脚本.当单独调用Python脚本时,我能够毫不费力地启动$EDITOR,但是当我将某些内容传递给Python脚本时,$EDITOR无法启动.现在,我正在使用纳米显示

Received SIGHUP or SIGTERM

每次.它似乎是同一个问题described here.

sinister:Programming [1313]$echo "import os;os.system('nano')" > "sample.py" 
sinister:Programming [1314]$python sample.py
# nano is successfully launched here.
sinister:Programming [1315]$echo "It dies here." | python sample.py 
Received SIGHUP or SIGTERM

Buffer written to nano.save.1

编辑:澄清;在程序内部,我没有管道编辑器.代码如下:

editorprocess = subprocess.Popen([editor or "vi", temppath])
editorreturncode = os.waitpid(editorprocess.pid, 0)[1]

解决方法:

当您将某些内容传递给进程时,管道将连接到该进程的标准输入.这意味着您的终端输入将不会连接到编辑器.大多数编辑还检查他们的标准输入是否是一个终端(isatty),而管道不是;如果它不是终端,他们将拒绝开始.在nano的情况下,这似乎导致它退出并包含您包含的消息:

% echo | nano
Received SIGHUP or SIGTERM

如果您希望能够将其标准输入传递给基于终端的编辑器,则需要以另一种方式为Python脚本提供输入,例如通过文件.

现在你已经澄清了你的问题,你不希望Python进程的stdin附加到编辑器,你可以修改你的代码如下:

editorprocess = subprocess.Popen([editor or "vi", temppath],
                                 stdin=open('/dev/tty', 'r'))
上一篇:C中的交互式管道


下一篇:如何用Python包装CLI程序(保持交互性)?