मुझे निम्नलिखित त्रुटि प्राप्त हो रही है:
WindowsError: [Error 2] The system cannot find the file specified
मेरा कोड है:
subprocess.call(["<<executable file found in PATH>>"])
विंडोज 7, 64 बिट। पायथन 3.x नवीनतम, स्थिर।
कोई विचार?
धन्यवाद,
मुझे निम्नलिखित त्रुटि प्राप्त हो रही है:
WindowsError: [Error 2] The system cannot find the file specified
मेरा कोड है:
subprocess.call(["<<executable file found in PATH>>"])
विंडोज 7, 64 बिट। पायथन 3.x नवीनतम, स्थिर।
कोई विचार?
धन्यवाद,
जवाबों:
जब कमांड एक शेल निर्मित होता है, तो कॉल में एक 'शेल = ट्रू' जोड़ें।
जैसे dirआप टाइप करेंगे:
import subprocess
subprocess.call('dir', shell=True)
प्रलेखन से उद्धृत करने के लिए:
केवल उस समय जब आपको शेल को निर्दिष्ट करने की आवश्यकता होती है = विंडोज पर सही तब होता है जब आप जिस कमांड को निष्पादित करना चाहते हैं वह शेल (जैसे डायर या कॉपी) में बनाया गया है। आपको बैच फ़ाइल या कंसोल-आधारित निष्पादन योग्य चलाने के लिए शेल = ट्रू की आवश्यकता नहीं है।
dir.exeएक निष्पादन योग्य नहीं है, जबकि वहाँ एक /bin/ls* निक्स है। dirको CMD.EXE द्वारा लागू किया जाता है जैसे cdकि बैश द्वारा कार्यान्वित किया जाता है ।
PATHकरना os.environऔर इसे मैन्युअल रूप से खोजना है।
विंडोज पर, मेरा मानना है कि subprocessमॉड्यूल PATHतब तक नहीं दिखता है जब तक आप पास नहीं करतेshell=True क्योंकि यह CreateProcess()पर्दे के पीछे उपयोग करता है। हालाँकि, shell=Trueयदि आप अपने प्रोग्राम के बाहर से आ रहे तर्कों को पारित कर रहे हैं तो सुरक्षा जोखिम हो सकता है। बनाने के लिए subprocessफिर भी सही निष्पादन ढूँढने में सक्षम है, तो आप उपयोग कर सकते हैं shutil.which। मान लीजिए कि आपके निष्पादन योग्य PATHनाम है frob:
subprocess.call([shutil.which('frob'), arg1, arg2])
(यह 3.3 और उससे अधिक पायथन पर काम करता है।)
विंडोज पर आपको cmd.exe के माध्यम से कॉल करना होगा। जैसा कि अपाला ने उल्लेख किया है, विंडोज कमांड को अलग-अलग निष्पादन योग्य नहीं के रूप में cmd.exe में लागू किया जाता है।
जैसे
subprocess.call(['cmd', '/c', 'dir'])
/ c फॉलो कमांड चलाने के लिए cmd को बताता है
यह शेल = ट्रू का उपयोग करने से अधिक सुरक्षित है, जो शेल इंजेक्शन की अनुमति देता है।
/kइसके बजाय प्रयास करें /c। cmd /?विवरण के लिए कमांड लाइन पर दर्ज करें ।
बहुत सिर खुजाने के बाद, मुझे पता चला कि 64 बिट मशीन पर पायथन के 32 बिट संस्करण को चलाने के दौरान C: \ Windows \ System32 \ में स्थित एक फाइल चलाना एक संभावित समस्या है, क्योंकि विंडोज ने प्रक्रिया को आउट-स्मार्ट करने की कोशिश की, और C: \ Windows \ System32 को C: \ Windows \ SysWOW64 पर पुनर्निर्देशित करता है।
मुझे यहाँ इसे ठीक करने का एक उदाहरण मिला: http://code.activestate.com/recipes/578035-disable-file-system-redirector/
प्रलेखन से उद्धृत करने के लिए:
"पायथन 3.5 से पहले, इन तीन कार्यों में उच्च स्तर के एपीआई से लेकर सबप्रोसेस शामिल थे। अब आप कई मामलों में रन () का उपयोग कर सकते हैं, लेकिन बहुत सारे मौजूदा कोड इन कार्यों को कहते हैं।"
SO: सबप्रोसेस के बजाय। सब पायथन 3.5 और इसके बाद के संस्करण के लिए subprocess.run का उपयोग करें