2010-07-26 8 views
11

किसी अन्य थ्रेड से स्पिनिंग, ossystem() का उपयोग करने के लिए उचित है जब rm -rf, cd, make, xterm, एलएस?पायथन - सामान्य लिनक्स कमांड जारी करने के लिए os.system() का उपयोग करना ठीक है

को देखते हुए, मैं इसे इन बिल्ट-इन अजगर आदेशों का उपयोग करने सुरक्षित है यह सोचते कर रहा हूँ के बजाय os.system का उपयोग कर()

किसी भी विचार (मेकअप और टर्म को छोड़कर) से ऊपर आदेशों की एनालॉग संस्करण हैं? मुझे उन्हें सुनना अच्छा लगेगा।

+3

अब तक जवाबों के अलावा ध्यान देने योग्य एक चीज़, पाइथन का उपयोग "गोंद" भाषा के रूप में आसानी से हाथ से बाहर हो सकती है। यदि आपके पास एक ऐसा प्रोग्राम है जो लगभग पूरी तरह से कमांड लाइन पर किए गए कार्यों का स्वचालित निष्पादन है, और आप गैर-यूनिक्स सिस्टम के बारे में चिंतित नहीं हैं, तो केवल शेल स्क्रिप्ट का उपयोग क्यों न करें? –

+4

os.system के बजाय उपप्रोसेसर मॉड्यूल का उपयोग करें। यदि आप प्रक्रिया पर किसी प्रकार का नियंत्रण चाहते हैं, तो आप आभारी होंगे। –

उत्तर

18

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

+5

उल्लेख नहीं है: यदि आपको इसे बहुत कुछ करने की ज़रूरत है, तो बहुत सी नई प्रक्रियाएं एक प्रदर्शन समस्या हो सकती हैं। –

+0

@ मैटियास, उत्कृष्ट टिप्पणी, मैंने इसे जवाब में लेने के लिए अपना उत्तर अपडेट कर दिया है। –

4

डारिन का जवाब एक अच्छी शुरुआत है।

इसके अलावा, यह एक बात है कि आप कितने पोर्टेबल बनने की योजना बना रहे हैं। यदि आपका कार्यक्रम केवल एक उचित "मानक" और "आधुनिक" लिनक्स पर चलने वाला है तो आपके लिए पहिया का पुन: आविष्कार करने का कोई कारण नहीं है; यदि आपने make या xterm को फिर से लिखने का प्रयास किया है तो वे आपके लिए सफेद कोट में पुरुषों को भेज देंगे। यदि यह काम करता है और आपके पास प्लेटफॉर्म चिंताओं नहीं हैं, तो खुद को दस्तक दें और पाइथन को गोंद के रूप में उपयोग करें!

यदि अज्ञात सिस्टम में संगतता एक बड़ा सौदा था तो आप पुस्तकालयों को एक मंच के स्वतंत्र तरीके से करने की आवश्यकता के अनुसार पुस्तकालयों की तलाश करने का प्रयास कर सकते थे। या आपको किस प्रकार की प्रणाली पर निर्भर करता है, इस पर निर्भर करते हुए आपको अलग-अलग नाम, पथ और तंत्र के साथ ऑन-बोर्ड उपयोगिताओं को कॉल करने का तरीका देखने की आवश्यकता है।

2

मैं सुझाव दूंगा कि आप केवल os.system का उपयोग उन चीज़ों के लिए करें जो os मॉड्यूल के भीतर पहले से ही समकक्ष नहीं हैं। अपने जीवन को कठिन क्यों बनाते हैं?

3

ओएससिस्टम उपयुक्त हो सकता है एकमात्र समय गैर-उत्पादन स्क्रिप्ट या किसी प्रकार के परीक्षण के लिए त्वरित और गंदे समाधान के लिए है। अन्यथा, अंतर्निहित कार्यों का उपयोग करना सबसे अच्छा है।

+0

मैंने इसे देखने से पहले एक समान उत्तर पोस्ट किया ... –

5

system() के साथ समस्याओं में से एक यह है कि यह आपके कमांड लाइन को पार्सिंग और निष्पादित करने के लिए शैल के वाक्यविन्यास और भाषा का ज्ञान है। यह एक बग के लिए संभावित बनाता है जहां आपने इनपुट को सही तरीके से मान्य नहीं किया है, और खोल वैरिएबल प्रतिस्थापन की तरह कुछ हस्तक्षेप कर सकता है या यह निर्धारित कर सकता है कि कोई तर्क जिस तरह से आप अपेक्षा नहीं करते हैं या समाप्त होता है। इसके अलावा, एक और ओएस के खोल में अपने आप से भिन्न वाक्यविन्यास हो सकता है, जिसमें बहुत सूक्ष्म विचलन शामिल है जिसे आप तुरंत नोटिस नहीं करेंगे। इस तरह के कारणों के लिए मैं system() के बजाय का उपयोग करना पसंद करता हूं - आप सीधे argv टोकन पास कर सकते हैं और मध्य में कुछ (गलत-) आपके इनपुट को पार्स करने के बारे में चिंता करने की ज़रूरत नहीं है।

system() के साथ एक और समस्या (यह execve() का उपयोग करने पर भी लागू होती है) यह है कि जब आप इसे कोड करते हैं, तो आप कह रहे हैं, "इस कार्यक्रम की तलाश करें, और इसे इन तर्कों को पास करें"। इससे कुछ धारणाएं होती हैं जो बग का कारण बन सकती हैं। पहला यह है कि कार्यक्रम मौजूद है और $PATH में पाया जा सकता है। शायद कुछ सिस्टम पर यह नहीं होगा। दूसरा, शायद कुछ सिस्टम पर, या यहां तक ​​कि अपने स्वयं के ओएस का भविष्य संस्करण, यह विकल्पों के एक अलग सेट का समर्थन करेगा। इस अर्थ में, मैं ऐसा करने से बचूंगा जबतक कि आप पूरी तरह से निश्चित नहीं हैं कि जिस प्रणाली पर आप चलेंगे, वह कार्यक्रम होगा। (शायद आप सिस्टम पर कैली प्रोग्राम को शुरू करने के लिए, या जिस तरह से आप इसे आमंत्रित करते हैं उसे POSIX जैसे कुछ द्वारा अनिवार्य किया जाता है।)

आखिरकार ... सही कार्यक्रम की तलाश में एक प्रदर्शन हिट भी है, एक नई प्रक्रिया बनाना, कार्यक्रम लोड करना आदि।यदि आप mv जैसे कुछ सरल कर रहे हैं, तो सिस्टम कॉल का उपयोग करने के लिए यह अधिक कुशल है।

system() से बचने के कुछ कारण हैं। निश्चित रूप से और भी हैं।

4

आपके प्रश्न में दो भाग हैं। आप "xterm", "rm -rf", और "cd" जैसे कॉलिंग कमांड का उल्लेख करते हैं।

साइड नोट: आप उप-शैल में 'सीडी' नहीं कह सकते हैं। मैं शर्त लगाता हूं कि एक चाल सवाल था ...

जहां तक ​​अन्य कमांड-स्तरीय चीजें आप कर सकते हैं, जैसे "आरएम-आरएफ कुछ", पहले से ही एक अजगर बराबर है। यह आपके प्रश्न के पहले भाग का जवाब देता है। लेकिन मुझे संदेह है कि आप वास्तव में दूसरे भाग के बारे में पूछ रहे हैं।

आपके प्रश्न का दूसरा भाग "क्या सिस्टम() या सबप्रोसेस मॉड्यूल की तरह कुछ चाहिए?" के रूप में पुनः लिखा जा सकता है।

मेरे पास आपके लिए एक सरल जवाब है: बस प्रोटोटाइप को छोड़कर "सिस्टम()" का उपयोग करने के लिए नहीं कहें।

यह सत्यापित करता है कि कुछ काम करता है, या कि "त्वरित और गंदी" स्क्रिप्ट के लिए के लिए ठीक है, लेकिन वहाँ सिर्फ os.system() के साथ भी कई समस्याएं हैं:

  1. यह आप के लिए एक खोल कांटे - ठीक है अगर आप एक
  2. जरूरत है यह आप के लिए वाइल्ड कार्ड का विस्तार - ठीक है जब तक आप की जरूरत नहीं है किसी भी
  3. यह अनुप्रेषित संभालती है - ठीक अगर आप चाहते हैं कि
  4. यह stderr/stdout में उत्पादन उदासीनता और से पढ़ता डिफ़ॉल्ट रूप से stdin
  5. यह उद्धरण को समझने की कोशिश करता है, लेकिन यह बहुत अच्छा नहीं करता है ('सीएमडी ">" ऑफाइल "आज़माएं)
  6. # 5 से संबंधित, यह हमेशा तर्क सीमाओं को नहीं दबाता है (यानी। उनमें रिक्त स्थान के साथ तर्क खराब हो सकते हैं)

बस "सिस्टम()" को न कहें!

1

ओएससिस्टम कॉल पायथन में 'फेंक दिया' शुरू हो रहा है। 'नया' प्रतिस्थापन subprocess.call या subprocess होगा। उपप्रोसेसर मॉड्यूल में खोलें। subprocess

सबप्रोसेस के बारे में अन्य अच्छी बात यह है कि आप stdout और stderr को चर में पढ़ सकते हैं, और प्रक्रिया को अन्य फाइलों पर रीडायरेक्ट किए बिना जांच सकते हैं।

जैसा कि दूसरों ने ऊपर कहा है, ज्यादातर चीजों के लिए मॉड्यूल हैं। जब तक आप कई अन्य आदेशों को एक साथ चिपकाने की कोशिश नहीं कर रहे हैं, मैं पुस्तकालय में शामिल चीजों के साथ रहना चाहता हूं। यदि आप फ़ाइलों की प्रतिलिपि बना रहे हैं, तो शटल का उपयोग करें, अभिलेखागार के साथ काम करते हुए आपको मॉड्यूल जैसे टैरिफाइल/ज़िपफाइल और अन्य कुछ मिलते हैं।

शुभकामनाएं।

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