Vra

Ek wil dit graag in python herhaal:

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

(hg cat file.txt voer die mees onlangs toegewyde weergawe van file.txt uit)

Ek weet hoe om die lêer na gvimdiff toe te stuur, maar dit sal nie 'n ander lêer aanvaar nie:

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

Kom by die luislang-deel...

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

Wanneer subproses genoem word, gaan dit net verby <(hg cat file) op gvimdiff as 'n lêernaam.

So, is daar enige manier om 'n opdrag te herlei soos bash doen?Vir eenvoud se onthalwe, kat net 'n lêer en herlei dit na verskil:

diff <(cat file.txt) file.txt
Was dit nuttig?

Oplossing

Dit kan gedoen word.Vanaf Python 2.5 is hierdie meganisme egter Linux-spesifiek en nie draagbaar nie:

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()

Dit gesê, in die spesifieke geval van diff, kan jy eenvoudig een van die lêers van stdin neem en die behoefte verwyder om die betrokke bash-alike funksionaliteit te gebruik:

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]

Ander wenke

Daar is ook die opdragte module:

import commands

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

Daar is ook die popen stel funksies, as jy wil die data eintlik grok van 'n opdrag as dit loop.

Dit is eintlik 'n voorbeeld in die docs :

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

Dit beteken vir jou:

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]

Dit verwyder die gebruik van die Linux-spesifieke / proc / self / FD stukkies, maak dit waarskynlik werk op ander Unices soos Solaris en die BSDs (insluitend MacOS) en dalk selfs werk op Windows.

Dit is net tot my deurgedring dat jy waarskynlik op soek is na een van die popen funksies.

uit: http://docs.python.org/lib/module-popen2 Html

popen3 (cmd [, bufsize [, af]])     Voer cmd as 'n sub-proses. Gee die lêer voorwerpe (child_stdout, child_stdin, child_stderr).

namaste, Mark

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top