我想在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])

当调用子gvimdiff ,它只将<(hg cat file)作为文件名传递给gvimdiff

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

diff <(cat file.txt) file.txt

===============>>#1 票数: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的特定情况下,您可以简单地从stdin获取其中一个文件,并且无需使用与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]

===============>>#2 票数:2

还有命令模块:

import commands

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

如果你想在命令运行时实际查看数据,还有popen函数集。

===============>>#3 票数: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上工作。

===============>>#4 票数:-1

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

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

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

纳马斯特,马克

  ask by alif translate from so

未解决问题?本站智能推荐:

1回复

VIM - 通过命令行传递冒号命令列表

美好的一天, 我正在BASHRC文件中编写一个简单的脚本,以容纳我在上一个问题中无法解决的问题: 在整个目录的svn-diff的Vim中并排查看 我基本上生成了一个具有“修改”SVN状态的所有文件的列表。 对于这些文件中的每一个,我想创建一个并排的可视差异,将其转换为HTML
4回复

如何忽略diff命令的一些差异?

diff有一个选项-I regexp ,它忽略只插入或删除与给定正则表达式匹配的行的更改。 我需要对这种情况进行类比,当两行之间发生变化时(而不是插入或删除行)。 例如,对于给定的X和Y ,我想忽略"abXd"和"abYd"之间的所有差异。 看来diff并没有这种能力。 diff
1回复

Vimdiff:如何将特定函数中的所有更改从一个文件放到另一个文件中?

在Vimdiff中,我知道我可以使用“do”或“dp”将更改从一个文件移动到另一个文件......但这些都是针对个别更改的。 如果我必须撤消特定范围/选择内的所有更改(比如撤消对特定功能的所有更改,但保持其余部分不变),有没有办法一次性完成?
2回复

有没有办法在一个vim选项卡中查看两个差异?

我知道vim中的差异在页面上是本地的,这意味着我们在一个标签页中只能有一个差异,对吗? 但是,如果我想在一个标签页中包含两个差异,该怎么办? 例如,一个差异位于顶部两个窗口之间,另一个差异位于底部两个窗口之间。 这是处理git merge confilict的常见问题。 我们可以在顶部的
6回复

(Vim)在同一个文件中区分两个子程序

有可能差异甚至vimdiff两个几乎相似的子程序出现在同一个文件中? 如果是这样,怎么样? 我可以想到将两个子程序复制到两个单独的文件中,然后对它们进行区分,但有没有办法在原始文件中进行? 谢谢!
4回复

如何在Vimdiff中展开/折叠差异部分?

我今天开始使用vimdiff了,并希望在基于Windows的差异编辑器上做一些我认为理所当然的事情(比如扩展/折叠差异部分,有完整的文件扩展/只有差异,上面有3个上下文行或者以下等)。 我目前只知道以下命令: 键盘快捷键: d o - 从其他窗口更改到当前窗口。 d p
1回复

使用vim在两列中查看“ cvs diff”输出

我有统一差异格式的“ cvs diff”输出(对于项目中的所有文件)。 格式可能是这样的: 甚至像这样: 有什么办法可以和vim一起查看此文本吗? 或者也许可以将CVS中的默认diff工具更改为vimdiff?
1回复

使用vimdiff查找特定列中的差异

我有一个非常大的csv文件,其中每个字段的宽度相同(因此每行的宽度相同)。 我需要找到特定列中的差异。 当我在vimdiff中打开2个文件时,大多数行被标记为差异,因为有一个定期更改的日期时间字段(例如,列10-15)。 对于差异,此字段的颜色正确为红色。 但是我很感兴趣,比如专栏5
4回复

在Vim中对两个垂直打开的窗口进行差异处理

我已经打开了两个文件。 它们以垂直模式打开,旁边是下一个。 我可以在不离开或关闭Vim的情况下立即区分这两个文件吗?
1回复

diff - 在十六进制转储中查找两个值之间的特定更改

我正在从我的基本命令行程序分析来自二进制数据转储的十六进制数据。 我基本上将结构的确切内容(实际上是一大堆结构)转储到文本文件中。 然后我创建第二个二进制转储,并使用xxd比较vim的两个文件,以创建原始数据的二进制到文本表示。 两个文件都是完全相同的字节大小,我试图以有意义的方式