Windows उपप्रोसेसर पर फ़ाइल नहीं ढूँढ सकता है। ()


103

मुझे निम्नलिखित त्रुटि प्राप्त हो रही है:

WindowsError: [Error 2] The system cannot find the file specified

मेरा कोड है:

subprocess.call(["<<executable file found in PATH>>"])

विंडोज 7, 64 बिट। पायथन 3.x नवीनतम, स्थिर।

कोई विचार?

धन्यवाद,


और यह निष्पादन योग्य फ़ाइल क्या है?
साइलेंटगॉस्ट

एंड्रॉइड एसडीके का "एंड्रॉइड" निष्पादन योग्य हिस्सा
श्री

2
और है है पथ पर उपलब्ध
श्री

क्या आप इसे कमांड लाइन से चला सकते हैं?
साइलेंटगॉस्ट

जो मैं पूरा करने की कोशिश कर रहा हूं उसकी थोड़ी पृष्ठभूमि। यह Opendevice के लिए है - HTML5 ऐप को डिवाइस विशिष्ट ऐप में बदलने के लिए एक ओपन सोर्स प्रोजेक्ट। मैं में os.system () को बदलने के लिए कोशिश कर रहा हूँ bitbucket.org/srirangan/opendevice/src/tip/tools/net/srirangan/... subprocess.call करने के लिए ()
श्री

जवाबों:


178

जब कमांड एक शेल निर्मित होता है, तो कॉल में एक 'शेल = ट्रू' जोड़ें।

जैसे dirआप टाइप करेंगे:

import subprocess
subprocess.call('dir', shell=True)

प्रलेखन से उद्धृत करने के लिए:

केवल उस समय जब आपको शेल को निर्दिष्ट करने की आवश्यकता होती है = विंडोज पर सही तब होता है जब आप जिस कमांड को निष्पादित करना चाहते हैं वह शेल (जैसे डायर या कॉपी) में बनाया गया है। आपको बैच फ़ाइल या कंसोल-आधारित निष्पादन योग्य चलाने के लिए शेल = ट्रू की आवश्यकता नहीं है।


14
ऐसा इसलिए है क्योंकि वहाँ dir.exeएक निष्पादन योग्य नहीं है, जबकि वहाँ एक /bin/ls* निक्स है। dirको CMD.EXE द्वारा लागू किया जाता है जैसे cdकि बैश द्वारा कार्यान्वित किया जाता है ।
अपाला

1
यह दृढ़ता से हतोत्साहित किया जाता है। docs.python.org/2/library/…
nu everest

11
@nueverest केवल तभी जब कमांड स्ट्रिंग बाहरी इनपुट से निर्मित होती है
Jirka

विकल्प (बाहरी इनपुट के लिए अधिक सुरक्षित) से प्राप्त PATHकरना os.environऔर इसे मैन्युअल रूप से खोजना है।
asmeurer

इस समस्या के और अधिक उचित समाधान के लिए stackoverflow.com/a/32799942/3912576 देखें ।
साइमनबिग्स

33

विंडोज पर, मेरा मानना ​​है कि subprocessमॉड्यूल PATHतब तक नहीं दिखता है जब तक आप पास नहीं करतेshell=True क्योंकि यह CreateProcess()पर्दे के पीछे उपयोग करता है। हालाँकि, shell=Trueयदि आप अपने प्रोग्राम के बाहर से आ रहे तर्कों को पारित कर रहे हैं तो सुरक्षा जोखिम हो सकता है। बनाने के लिए subprocessफिर भी सही निष्पादन ढूँढने में सक्षम है, तो आप उपयोग कर सकते हैं shutil.which। मान लीजिए कि आपके निष्पादन योग्य PATHनाम है frob:

subprocess.call([shutil.which('frob'), arg1, arg2])

(यह 3.3 और उससे अधिक पायथन पर काम करता है।)


4
कोई अजगर 2 विकल्प?
नरसिम्ह

1
आप सही हैं और आप इसे ठीक करने का सही तरीका सुझा रहे हैं। यह उत्तर स्वीकार किया जाना चाहिए। वर्तमान में स्वीकृत उत्तर कारण को स्पष्ट नहीं करता है और एक निश्चित सुझाव दे रहा है जो कुछ मामलों में खतरनाक हो सकता है।
डेविड फेरेन्स्की रोगोजान

18

विंडोज पर आपको cmd.exe के माध्यम से कॉल करना होगा। जैसा कि अपाला ने उल्लेख किया है, विंडोज कमांड को अलग-अलग निष्पादन योग्य नहीं के रूप में cmd.exe में लागू किया जाता है।

जैसे

subprocess.call(['cmd', '/c', 'dir'])

/ c फॉलो कमांड चलाने के लिए cmd को बताता है

यह शेल = ट्रू का उपयोग करने से अधिक सुरक्षित है, जो शेल इंजेक्शन की अनुमति देता है।


मैं स्क्रीन को कैसे खुला रखूंगा?
मूंदड़ा

2
@ नमस्कार, अगर मैं आपको सही तरीके से समझूं, तो /kइसके बजाय प्रयास करें /ccmd /?विवरण के लिए कमांड लाइन पर दर्ज करें ।
2:59 पर उपयोगकर्ता5910

@ User5910 धन्यवाद। मौका मिलने पर इसे आजमाऊंगा।
मूंदड़ा

3

यदि आप शक्तियां उपयोग कर रहे हैं, तो इसमें होगा subprocess.call(['powershell','-command','dir'])। Powershell POSIX कमांड के एक बड़े हिस्से का समर्थन करता है


2

बहुत सिर खुजाने के बाद, मुझे पता चला कि 64 बिट मशीन पर पायथन के 32 बिट संस्करण को चलाने के दौरान C: \ Windows \ System32 \ में स्थित एक फाइल चलाना एक संभावित समस्या है, क्योंकि विंडोज ने प्रक्रिया को आउट-स्मार्ट करने की कोशिश की, और C: \ Windows \ System32 को C: \ Windows \ SysWOW64 पर पुनर्निर्देशित करता है।

मुझे यहाँ इसे ठीक करने का एक उदाहरण मिला: http://code.activestate.com/recipes/578035-disable-file-system-redirector/


1

प्रलेखन से उद्धृत करने के लिए:

"पायथन 3.5 से पहले, इन तीन कार्यों में उच्च स्तर के एपीआई से लेकर सबप्रोसेस शामिल थे। अब आप कई मामलों में रन () का उपयोग कर सकते हैं, लेकिन बहुत सारे मौजूदा कोड इन कार्यों को कहते हैं।"

SO: सबप्रोसेस के बजाय। सब पायथन 3.5 और इसके बाद के संस्करण के लिए subprocess.run का उपयोग करें


सच्चा और मददगार।
एरिक जी। हागस्ट्रॉम

0

जब मैं पीएचपी बुला रहा था तो मैं उसी मुद्दे पर मिला था। इसका कारण है PHP PATH में नहीं है इसलिए कमांड PHP नहीं मिली। लेकिन PowerShell ने पाया कि यह वर्तमान स्थान पर मौजूद है और यह '। PHP' की जगह 'PHP' को बदलने का सुझाव देता है अगर मैं इस कमांड पर भरोसा करता हूं। फिर अच्छा चलता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.