2012-08-07 13 views
5

के साथ काम करना मेरी पाइथन स्क्रिप्ट को 'xargs' के साथ अच्छी तरह से काम करने की प्रक्रिया क्या होगी? उदाहरण के लिए, मैं निम्न आदेश पाठ फ़ाइल की प्रत्येक पंक्ति के माध्यम से काम करने के लिए, और निष्पादित एक मनमाना आदेश चाहते हैं:पायथन स्क्रिप्ट्स xargs

cat servers.txt | ./hardware.py -m 

अनिवार्य रूप से प्रत्येक पंक्ति hardware.py स्क्रिप्ट को पारित किया जा करना चाहते हैं।

+2

जो आप दिखाते हैं वह * मानक इनपुट * है, लेकिन आप जो पूछते हैं * 'xargs' है। ये एक ही चीज नहीं हैं। आप कौन सा चाहते थे – kojiro

+0

क्या कोई विशेष कारण है कि आप केवल Python में टेक्स्ट फ़ाइल में नहीं पढ़ सकते हैं? – ciferkey

+0

पाइप बस 'cat' 'stdout' को hardware.py' stdin' से जोड़ता है। तो, हार्डवेयर.py में, आपको केवल 'stdin' (जैसे डेटा = raw_input()) से डेटा पढ़ना चाहिए। –

उत्तर

6

अपने आदेश xargs के साथ काम करने के लिए आपको बस उन्हें स्वीकार करने की आवश्यकता है। पायथन में तर्क sys.argv सूची में हैं। इस तरह आप की तरह somthing पर अमल कर सकते हैं: जो

./myscript.py ./foo.txt ./biz/foobar.txt ./baz/yougettheidea.txt 

के बराबर अपने आदेश मानक इनपुट के साथ काम करने के लिए हो सकता है

find . -type f -name '*.txt' -print0 | xargs -0 ./myscript.py 

, आप भी sys.stdin साथ sys मॉड्यूल, इस समय का उपयोग कर सकते हैं, जिसे आप फाइल के रूप में देख सकते हैं। यह आपके द्वारा दिए गए उदाहरण की तरह है:

./myscript.py < somefile.txt 
1

आप दो मुद्दों को भ्रमित कर रहे हैं।

सबसे पहले, आपका आवेदन stdin से इनपुट प्राप्त कर सकता है। इसका xargs से कोई लेना देना नहीं है। अपने उदाहरण में, सभी hardware.py करने की जरूरत इनपुट फ़ाइल के रूप में sys.stdin पढ़ा जाता है, जैसे:

if __name__=='__main__': 
    for line in sys.stdin: 
     do_something(line) 

आप उत्पादन है कि रेखा के नीचे अन्य कार्यक्रमों का उपयोग कर सकते उत्पादन करने के लिए hardware.py चाहते हैं, बस sys.stdout

को लिखने

दूसरा, आपका आवेदन तर्क से इनपुट प्राप्त कर सकता है। यह वह जगह है जहां आप xargs का उपयोग करेंगे। उदाहरण के लिए:

xargs ./hardware.py < server.txt # cat server.txt के समान # | xargs ./hardware.py

यह (एक ही बार में संभवतः कई तर्क) hardware.py लिए एक तर्क के रूप में हर servers.txt की "शब्द" (नहीं हर लाइन) से होकर गुजरेगा। यह hardware.py word1 word2 word3 word4 ...

पाइथन स्टोर्स कमांड लाइन तर्क sys.arvg सरणी के समान होगा। sys.argv[0] कमांड नाम होगा, और sys.argv[1:] सभी कमांड लाइन तर्क होंगे। हालांकि, आप आमतौर पर argparse का उपयोग करके अपनी कमांड लाइन को संसाधित करने से बेहतर होते हैं।

0

यह स्पष्ट नहीं है कि आप क्या करना चाहते हैं।./hardware.py -m तर्क के रूप में एक ही सर्वर लेता है

cat servers.txt | parallel --pipe -N1 ./hardware.py -m 

आप कर सकते हैं: ./hardware.py -m मानक इनपुट से एक पंक्ति पढ़ता है, तो आप उन पंक्तियों को वितरित करने के जीएनयू समानांतर का उपयोग कर सकते

cat servers.txt | parallel ./hardware.py -m 

आप जीएनयू समानांतर स्थापित कर सकते हैं बस से:

wget http://git.savannah.gnu.org/cgit/parallel.git/plain/src/parallel 
chmod 755 parallel 
cp parallel sem 

अधिक जानने के लिए जीएनयू समानांतर के लिए परिचय वीडियो देखें: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

संबंधित मुद्दे