2008-09-16 24 views
6

başka girişine komutu yönlendir gvimdiff nasıl üzere boru dosyası, ancak başka bir dosyayı kabul olmaz: ... piton kısmına alınıyorPython bu çoğaltmak istiyoruz Python

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

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

Alt işlem çağrıldığında, <(hg cat file) yalnızca gvimdiff dosya adına bir dosya adı olarak geçer.

Yani, bir komutu bash olarak yeniden yönlendirmenin herhangi bir yolu var mı? Basitlik'ın sadece kedi, bir dosya için ve diff için yönlendirme: aslında grok istiyorsanız fonksiyonların popen seti, ayrıca

import commands 

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

yok:

diff <(cat file.txt) file.txt 

cevap

9

Yapılabilir. Python 2.5 itibariyle Ancak bu mekanizma Linux özgü ve taşınabilir değildir: diff özelinde, sadece stdin'den dosyalardan birini almak ve gereğini kaldırabilir dedi

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

söz konusu bash-benzeri işlevini kullanmak:

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] 
+0

Güzel çözüm. Ayrıca ilgisi de bash: > python -c "import sys; print (sys.argv)" <(echo hello) function_proj.cc ['-c', '/ dev/fd/63', ' function_proj.cc '] – gatoatigrado

+0

@gatoatigrado - en azından sistemlerimde, '/ dev/fd'/proc/self/fd'ye bir sembolik bağlantı kurabilir –

2

da komutlar modülü vardır Bir komuttan gelen veriler çalışıyor.

-1

Sadece bana, muhtemelen, popen işlevlerinden birini aradığınızı gördüm. den

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

popen3 bir alt proses olarak cmd çalıştırır (cmd [mod] [BUFSIZE]). Dosya nesnelerini döndürür (child_stdout, child_stdin, child_stderr).

Namaste, Mark

+0

Cevabınızı reddetmedim, ancak alt işlem modülünün popen * modüllerini değiştirmeyi amaçladığını unutmayın. – tzot

2

Bu aslında docs bir örnektir:

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

sizin için anlamı:

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] 

Bu muhtemelen diğer Solaris gibi Unix'lerde ve (MacOS dahil) ve hatta belki de Windows üzerinde çalışmak BSD üzerinde çalışmak yapma, linux özgü/proc/öz/fd bit kullanımını ortadan kaldırır.

+0

Bu, posterin sorması gereken soruya cevap verir, ve yaptığı gibi değil - ama yine de iyi bir cevap, bu yüzden onu takip ediyorum; umarım sakıncası yoktur. :) (btw, gvimdiff'in dokümanları stdin'den okuyabildiğini göstermez; bunu denediniz mi?) –