Os.system का उपयोग करते समय () यह अक्सर फाइलनाम और अन्य तर्कों से बचने के लिए आवश्यक होता है जो कमांड के मापदंडों के रूप में पारित किए जाते हैं। मैं यह कैसे कर सकता हूँ? अधिमानतः कुछ ऐसा जो कई ऑपरेटिंग सिस्टम / शेल पर काम करेगा, लेकिन विशेष रूप से बैश के लिए।
मैं वर्तमान में निम्नलिखित कार्य कर रहा हूं, लेकिन मुझे यकीन है कि इसके लिए एक लाइब्रेरी फ़ंक्शन होना चाहिए, या कम से कम अधिक सुरुचिपूर्ण / मजबूत / कुशल विकल्प:
def sh_escape(s):
return s.replace("(","\\(").replace(")","\\)").replace(" ","\\ ")
os.system("cat %s | grep something | sort > %s"
% (sh_escape(in_filename),
sh_escape(out_filename)))
संपादित करें: मैंने उद्धरणों का उपयोग करने का सरल उत्तर स्वीकार किया है, पता नहीं क्यों मैंने ऐसा नहीं सोचा था; मुझे लगता है क्योंकि मैं विंडोज से आया था, जहां 'और' थोड़ा अलग तरह से व्यवहार करते हैं।
सुरक्षा के बारे में, मैं चिंता को समझता हूं, लेकिन, इस मामले में, मुझे एक त्वरित और आसान समाधान में दिलचस्पी है जो os.system () प्रदान करता है, और तार का स्रोत या तो उपयोगकर्ता-जनित नहीं है या कम से कम एक प्रवेश द्वारा दर्ज किया गया है विश्वसनीय उपयोगकर्ता (मुझे)
sh_escape
फ़ंक्शन ;
रिक्त स्थान और रिक्त स्थान से बाहर निकलेगा और केवल एक फ़ाइल बनाकर सुरक्षा समस्या को दूर करेगा, जैसे कुछ foo.txt\;\ rm\ -rf\ /
।