7

我想在python中复制它:

gvimdiff <(hg cat file.txt) file.txt

(hg cat file.txt 输出最近提交的 file.txt 版本)

我知道如何将文件传输到 gvimdiff,但它不会接受另一个文件:

$ hg cat file.txt | gvimdiff file.txt -
Too many edit arguments: "-"

进入python部分......

# hgdiff.py
import subprocess
import sys
file = sys.argv[1]
subprocess.call(["gvimdiff", "<(hg cat %s)" % file, file])

当 subprocess 被调用时,它只是<(hg cat file)作为gvimdiff文件名传递。

那么,有没有办法像 bash 那样重定向命令?为简单起见,只需 cat 一个文件并将其重定向到 diff:

diff <(cat file.txt) file.txt
4

4 回答 4

9

可以办到。然而,从 Python 2.5 开始,这种机制是特定于 Linux 的,并且不可移植:

import subprocess
import sys

file = sys.argv[1]
p1 = subprocess.Popen(['hg', 'cat', file], stdout=subprocess.PIPE)
p2 = subprocess.Popen([
    'gvimdiff',
    '/proc/self/fd/%s' % p1.stdout.fileno(),
    file])
p2.wait()

也就是说,在 diff 的特定情况下,您可以简单地从标准输入中获取文件之一,而无需使用相关的 bash 类似功能:

file = sys.argv[1]
p1 = subprocess.Popen(['hg', 'cat', file], stdout=subprocess.PIPE)
p2 = subprocess.Popen(['diff', '-', file], stdin=p1.stdout)
diff_text = p2.communicate()[0]
于 2008-09-16T23:57:32.093 回答
2

还有命令模块:

import commands

status, output = commands.getstatusoutput("gvimdiff <(hg cat file.txt) file.txt")

如果您想在命令运行时实际从命令中获取数据,那么还有一组 popen 函数。

于 2008-09-16T23:53:40.170 回答
2

这实际上是文档中的一个示例:

p1 = Popen(["dmesg"], stdout=PIPE)
p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
output = p2.communicate()[0]

这对你来说意味着:

import subprocess
import sys

file = sys.argv[1]
p1 = Popen(["hg", "cat", file], stdout=PIPE)
p2 = Popen(["gvimdiff", "file.txt"], stdin=p1.stdout, stdout=PIPE)
output = p2.communicate()[0]

这消除了 linux 特定 /proc/self/fd 位的使用,使其可能在其他 unices 上工作,如 Solaris 和 BSD(包括 MacOS),甚至可能在 Windows 上工作。

于 2008-09-17T01:26:43.597 回答
-1

我突然意识到您可能正在寻找其中一个 popen 功能。

来自:http ://docs.python.org/lib/module-popen2.html

popen3(cmd[, bufsize[, mode]]) 将 cmd 作为子进程执行。返回文件对象(child_stdout、child_stdin、child_stderr)。

合十礼,马克

于 2008-09-16T23:57:24.840 回答