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