我有一个需要调用定义的$EDITOR
或$VISUAL
的python脚本。当单独调用Python脚本时,我能够毫不费力地启动$EDITOR
,但是当我将某些内容传递给Python脚本时,$EDITOR
无法启动。现在,我正在使用nano显示
收到SIGHUP或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]
答案 0 :(得分:4)
当您将某些内容传递给进程时,管道将连接到该进程的标准输入。这意味着您的终端输入将不会连接到编辑器。大多数编辑还检查他们的标准输入是否是一个终端(isatty),而管道不是;如果它不是终端,他们将拒绝开始。在nano
的情况下,这似乎会导致它退出并显示您包含的消息:
% echo | nano
Received SIGHUP or SIGTERM
如果您希望能够将其标准输入传递给基于终端的编辑器,则需要以另一种方式为Python脚本提供输入,例如通过文件。
现在您已经澄清了您的问题,您不希望Python进程的stdin
附加到编辑器,您可以按如下方式修改代码:
editorprocess = subprocess.Popen([editor or "vi", temppath],
stdin=open('/dev/tty', 'r'))
答案 1 :(得分:2)
此处处理find -type f | vidir -
的具体情况:
foreach my $item (@ARGV) {
if ($item eq "-") {
push @dir, map { chomp; $_ } <STDIN>;
close STDIN;
open(STDIN, "/dev/tty") || die "reopen: $!\n";
}
您也可以在Python中重新创建此行为:
#!/usr/bin/python
import os
import sys
sys.stdin.close()
o = os.open("/dev/tty", os.O_RDONLY)
os.dup2(o, 0)
os.system('vim')
当然,关闭标准输入文件描述符,所以如果你打算在启动编辑器后再次读取它,你应该在关闭它之前复制它的文件描述符。