ali*_*lif 7 python bash diff redirect vimdiff
我想在python中复制它:
gvimdiff <(hg cat file.txt) file.txt
Run Code Online (Sandbox Code Playgroud)
(hg cat file.txt输出最近提交的file.txt版本)
我知道如何将文件传递给gvimdiff,但它不会接受另一个文件:
$ hg cat file.txt | gvimdiff file.txt -
Too many edit arguments: "-"
Run Code Online (Sandbox Code Playgroud)
进入python部分......
# hgdiff.py
import subprocess
import sys
file = sys.argv[1]
subprocess.call(["gvimdiff", "<(hg cat %s)" % file, file])
Run Code Online (Sandbox Code Playgroud)
当子过程被称为它仅仅传递<(hg cat file)到gvimdiff作为文件名.
那么,有没有办法像bash那样重定向命令?为简单起见,只需捕获一个文件并将其重定向到diff:
diff <(cat file.txt) file.txt
Run Code Online (Sandbox Code Playgroud)
可以办到.但是,从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()
Run Code Online (Sandbox Code Playgroud)
也就是说,在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]
Run Code Online (Sandbox Code Playgroud)