2011-12-25 12 views
5

मैं निम्नलिखित पायथन लाइनों हैअजगर बैश के लिए उपप्रक्रिया: घुंघराले ब्रेसिज़

import subprocess 
subprocess.Popen("egrep -r --exclude=*{.git,.svn}* \"text\" ~/directory", stdout=subprocess.PIPE, shell=True).communicate()[0] 

दुर्भाग्य से, पार्टी पूरी तरह से --exclude = * ध्यान नहीं देता {। Git, .svn} * झंडा।

मैंने घुंघराले ब्रेसिज़ को समस्या को कम कर दिया है। - exclude = *। git * पायथन के पॉपन के माध्यम से काम करेगा, लेकिन पल घुंघराले ब्रेसिज़ पेश किए जाते हैं, मैं असहाय छोड़ दिया गया है। कोई सुझाव?

नोट: - और ठीक उसी पर ध्यान नहीं दिया --exclude झंडा मैं आदेश पायथन के आदेश लाइब्रेरी का उपयोग कर चलाने का भी प्रयास है, यह ठीक उसी उत्पादन पैदा करता है।

उत्तर

2

मुझे लगता है कि यह खोल से बच सकता है?

तर्कों का अपना खुद का विभाजन करना सबसे अच्छा हो सकता है, और पूरी तरह से खोल से बचें?

import subprocess 
subprocess.Popen(["egrep","-r","--exclude=*{.git,.svn}*","text","~/directory"], stdout=subprocess.PIPE).communicate()[0] 

एनबी: आप ~ विस्तार करने के लिए हो सकता है, मुझे यकीन है कि नहीं हूँ।

या अगर बैश ब्रेसिज़ विस्तार माना जाता है तो आप अजगर में यह कर सकता है:

excludes = ['.git','.svn'] 
command = ['egrep','-r'] 
for e in excludes: 
    command.append('--exclude=*%s*'%e) 
command += ["text","~/directory"] 
subprocess.Popen(command, stdout=subprocess.PIPE).communicate()[0] 
+0

यह दोनों और बैश खोल निर्दिष्ट करने के लिए महान काम करते हैं! – user1115304

3

जब आप पारित खोल = सच, अजगर /bin/sh -c <command> को आदेश (के रूप में वर्णित here) अनुवाद करता है।/bin/sh स्पष्ट रूप से घुंघराले ब्रेसिज़ विस्तार का समर्थन नहीं करता है। इसके बजाय आप निम्नलिखित की कोशिश कर सकते हैं:

import subprocess 
subprocess.Popen(["/bin/bash", "-c", "egrep -r --exclude=*{.git,.svn}* \"text\" ~/directory"], stdout=subprocess.PIPE).communicate()[0] 
+0

दोनों और शैल से बचने के लिए तर्कों को विभाजित करना बहुत अच्छा काम करता है! – user1115304

0

आपको लगता है कि अभिव्यक्ति अपने वर्तमान कार्यशील निर्देशिका के खिलाफ यह मूल्यांकन करने से बैश रखने के लिए जब आप इसे बंद आग उद्धृत करने के लिए की जरूरत है। आपके खोज शब्द के साथ आपके पास एक बग भी है, यह मानते हुए कि आप "टेक्स्ट" (कोटेशन के साथ) ढूंढ रहे हैं। आपका भागने पाइथन स्ट्रिंग में उद्धरण प्राप्त करता है लेकिन खोल को देखने के लिए फिर से किया जाना चाहिए।

आईई। ... --exclude='*{.git,.svn}*' \\\"text\\\" ...

0

एक अजगर popen दृष्टिकोण से, आप क्या wrotten है काम करता है, तो आप एक अजगर चर में आउटपुट को कैप्चर प्रदान की:

import subprocess 
myOutput = subprocess.Popen("egrep -r --exclude=*{.git,.svn}* \"text\" ~/directory", stdout=subprocess.PIPE, shell=True).communicate()[0] 
print "Output: ", myOutput 

मैं डिफ़ॉल्ट शैल कमांड के रूप में बैश के साथ एक टर्मिनल में परीक्षण किया है, और यह अच्छा काम करता है।

ध्यान दें कि 'grep -E' को 'egrep' को प्राथमिकता दी जानी चाहिए, जिसे अब बहिष्कृत किया गया है।

और आप निश्चित रूप से जानते हैं कि \ Bash के लिए भी बचने वाला चरित्र है, है ना? मेरा मतलब है, '*' और घुंघराले ब्रेसिज़ बैश द्वारा खाए जाते हैं, और इसलिए उन्हें grep को सौंप दिया नहीं जाता है। इसलिए आपको उनसे बच जाना चाहिए।

grep -Er --exclude=\*\{.git,.svn\}\* \"text\" ~/directory 
संबंधित मुद्दे