在Python中管道传输到脚本时无法启动交互式程序

在Python中管道传输到脚本时无法启动交互式程序,python,subprocess,interactive,nano,Python,Subprocess,Interactive,Nano,我有一个python脚本,需要调用已定义的$EDITOR或$VISUAL。当单独调用Python脚本时,我能够顺利启动$EDITOR,但是当我将某些内容导入Python脚本时,$EDITOR就无法启动。现在,我正在使用nano,它显示 收到SIGHUP或SIGTERM 每一次。这似乎是同一个问题 编辑:澄清;在程序内部,我没有向编辑器发送管道。代码如下: editorprocess = subprocess.Popen([editor or "vi", temppath]) editorretu

我有一个python脚本,需要调用已定义的
$EDITOR
$VISUAL
。当单独调用Python脚本时,我能够顺利启动
$EDITOR
,但是当我将某些内容导入Python脚本时,
$EDITOR
就无法启动。现在,我正在使用nano,它显示

收到SIGHUP或SIGTERM

每一次。这似乎是同一个问题

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

editorprocess = subprocess.Popen([editor or "vi", temppath])
editorreturncode = os.waitpid(editorprocess.pid, 0)[1]
editorprocess = subprocess.Popen([editor or "vi", temppath],
                                 stdin=open('/dev/tty', 'r'))

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

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

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

editorprocess = subprocess.Popen([editor or "vi", temppath])
editorreturncode = os.waitpid(editorprocess.pid, 0)[1]
editorprocess = subprocess.Popen([editor or "vi", temppath],
                                 stdin=open('/dev/tty', 'r'))

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脚本启动编辑器,并将终端输入保留为标准输入?@xiao Yes,这就是我想要做的。尼古拉斯的解决方案正是如此。@eric,但是
echo hi | vidir
仍然失败,与您的脚本一样
echo hi | mutt
甚至不尝试启动编辑器,它尝试在
mail(1)
中运行—就像时尚一样……好吧,您可以随意重写内核,但说真的,类似Unix的操作系统就是这样工作的。当
mutt
生成一个编辑器时,它使用一个临时文件正是出于这个原因。@sarnold尝试
vidir-
find-type f | vidir-
vidir
使用
/dev/tty
,这可能不适用于任何地方,但如果您不介意,请关闭标准输入并用该文件重新打开。@Nicholas我使用的是临时文件;在程序内部,我称之为[“nano”,tempfile],但这仍然不能解决问题。我不是在向编辑汇报。这也行得通,但我认为尼古拉斯的回复是首选解决方案,因为它不需要关闭stdin。谢谢。@Eric,是的,当我看到他的回答时,我觉得很优雅:)对图书馆的日常工作更有用。