2

我有一个 python 脚本需要调用定义的$EDITOR$VISUAL. 当单独调用 Python 脚本时,我可以$EDITOR顺利启动,但是当我将某些内容传递给 Python 脚本时,$EDITOR就无法启动。现在,我正在使用 nano 显示

收到 SIGHUP 或 SIGTERM

每次。这似乎与此处描述的问题相同。

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]
4

2 回答 2

4

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

% echo | nano
Received SIGHUP or SIGTERM

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

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

editorprocess = subprocess.Popen([editor or "vi", temppath],
                                 stdin=open('/dev/tty', 'r'))
于 2011-05-13T02:18:37.863 回答
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')

当然,它会关闭标准输入文件描述符,因此如果您打算在启动编辑器后再次读取它,您可能应该在关闭它之前复制它的文件描述符。

于 2011-05-13T03:11:16.697 回答