重定向命令以在Python中输入另一个

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)

Cha*_*ffy 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()
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)