Question

Je voudrais reproduire cela en python:

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

(hg cat fichier.txt génère la version la plus récente de fichier.txt)

Je sais diriger le fichier vers gvimdiff, mais il n'acceptera pas un autre fichier:

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

Accéder à la partie python ...

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

Lorsque le sous-processus est appelé, il ne fait que passer <(hg cat file) à gvimdiff en tant que nom de fichier.

Alors, y a-t-il un moyen de rediriger une commande comme le fait bash? Pour simplifier, il suffit de lire un fichier dans un fichier et de le rediriger vers diff:

diff <(cat file.txt) file.txt
Était-ce utile?

La solution

Cela peut être fait. Toutefois, à partir de Python 2.5, ce mécanisme est spécifique à Linux et n'est pas portable:

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

Cela dit, dans le cas spécifique de diff, vous pouvez simplement extraire l'un des fichiers de stdin et supprimer la nécessité d'utiliser la fonctionnalité bash-alike en question:

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]

Autres conseils

Il y a aussi le module de commandes:

import commands

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

Il existe également le jeu de fonctions contextuel, si vous souhaitez réellement stocker les données d'une commande en cours d'exécution.

Il s'agit en fait d'un exemple dans les docs :

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

ce qui signifie pour vous:

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]

Cela supprime l'utilisation des bits / proc / self / fd spécifiques à Linux, ce qui le rend probablement compatible avec d'autres systèmes comme Solaris et les BSD (y compris MacOS) et peut-être même sous Windows.

Je viens de me rendre compte que vous êtes probablement à la recherche d'une fonction Popen.

à partir de: http://docs.python.org/lib/module-popen2 .html

popen3 (cmd [, bufsize [, mode]])     Exécute cmd en tant que sous-processus. Renvoie les objets du fichier (child_stdout, child_stdin, child_stderr).

namaste, Mark

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top