2008-09-16 18 views
6

में एक और की इनपुट करने के लिए आदेश को पुन: निर्देशित मैं अजगर में इस को दोहराने के लिए करना चाहते हैं:अजगर

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

(एचजी बिल्ली file.txt file.txt की सबसे हाल ही में प्रतिबद्ध संस्करण आउटपुट)

मुझे पता है कैसे करने के लिए पाइप फ़ाइल gvimdiff है, लेकिन यह एक और फ़ाइल को स्वीकार नहीं करेगा:

$ 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]) 

जब उपप्रोसेसर कहा जाता है तो यह केवल <(hg cat file) को gvimdiff पर फ़ाइल नाम के रूप में पास करता है।

तो, क्या बैश के रूप में कमांड को रीडायरेक्ट करने का कोई तरीका है? सादगी की खातिर सिर्फ बिल्ली एक फ़ाइल के लिए और इसे पुन: निर्देशित diff रहे हैं:

import commands 

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

वहाँ भी, कार्यों का popen सेट है यदि आप वास्तव में grok हैं:

diff <(cat file.txt) file.txt 

उत्तर

9

यह किया जा सकता है। अजगर 2.5 के रूप में, हालांकि, इस तंत्र लिनक्स विशिष्ट और पोर्टेबल नहीं है:

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

जिसके अनुसार, भिन्नता की विशिष्ट मामले में, आप बस stdin से फ़ाइलों में से एक ले जा सकते हैं, और करने के लिए की आवश्यकता को दूर प्रश्न में पार्टी एक जैसे कार्यक्षमता का उपयोग:

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

अच्छा समाधान। इसके अलावा ब्याज भी है: > पायथन-सी "आयात sys; प्रिंट (sys.argv)" <(echo हैलो) function_proj.cc ['-c', '/ dev/fd/63', ' function_proj।सीसी '] – gatoatigrado

+0

@gatoatigrado - कम से कम मेरे सिस्टम पर, '/ dev/fd''/proc/self/fd' –

2

भी आदेशों मॉड्यूल नहीं है एक आदेश से डेटा चल रहा है के रूप में।

-1

यह सिर्फ मुझ पर आ गया कि आप संभवतः एक पॉपन कार्यों की तलाश में हैं।

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

popen3 (cmd [, bufsize [, मोड]]) एक उप प्रक्रिया के रूप में cmd ​​पर क्रियान्वित। फ़ाइल ऑब्जेक्ट्स (child_stdout, child_stdin, child_stderr) देता है।

नमस्ते, मार्क

+0

मैंने आपके उत्तर को कम नहीं किया है, लेकिन ध्यान रखें कि सबप्रोसेस मॉड्यूल पॉपन * मॉड्यूल को प्रतिस्थापित करने के लिए है। – tzot

2

यह वास्तव में docs में एक उदाहरण है:

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

आप के लिए जिसका अर्थ है:

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] 

यह, लिनक्स विशिष्ट/proc/self/fd बिट्स के उपयोग को हटा यह शायद और Solaris जैसे अन्य unices (MacOS सहित) और शायद विंडोज पर काम BSDs पर काम कर रही है।

+0

पर एक सिम्लिंक है, यह पोस्टर से पूछे जाने वाले प्रश्न का उत्तर देता है, न कि उसने जो किया - लेकिन फिर भी यह एक अच्छा जवाब है, इसलिए मैं इसे पकड़ रहा हूं; आशा है कि आपको बुरा लगेगा। :) (बीटीडब्ल्यू, gvimdiff के दस्तावेज़ यह इंगित नहीं करते कि यह stdin से पढ़ सकता है; क्या आपने कोशिश की?) –