मैं पायथन से एक कार्यक्रम को कैसे निष्पादित करूं? मार्ग में रिक्त स्थान होने के कारण os.system विफल रहता है


273

मेरे पास एक पायथन स्क्रिप्ट है जिसे किसी बाहरी कार्यक्रम को निष्पादित करने की आवश्यकता है, लेकिन किसी कारण से विफल हो जाता है।

अगर मेरे पास निम्न स्क्रिप्ट है:

import os;
os.system("C:\\Temp\\a b c\\Notepad.exe");
raw_input();

तब यह निम्न त्रुटि के साथ विफल हो जाता है:

'C: \ Temp \' एक आंतरिक या बाहरी कमांड, ऑपरेबल प्रोग्राम या बैच फ़ाइल के रूप में मान्यता प्राप्त नहीं है।

यदि मैं उद्धरण के साथ कार्यक्रम से बचता हूं:

import os;
os.system('"C:\\Temp\\a b c\\Notepad.exe"');
raw_input();

तब यह काम करता है। हालाँकि, यदि मैं कोई पैरामीटर जोड़ता हूं, तो वह फिर से काम करना बंद कर देता है:

import os;
os.system('"C:\\Temp\\a b c\\Notepad.exe" "C:\\test.txt"');
raw_input();

किसी प्रोग्राम को निष्पादित करने और उसे पूरा करने के लिए इंतजार करने का सही तरीका क्या है? मुझे इससे आउटपुट पढ़ने की ज़रूरत नहीं है, क्योंकि यह एक विज़ुअल प्रोग्राम है जो नौकरी करता है और फिर बस निकल जाता है, लेकिन मुझे इसके पूरा होने का इंतज़ार करने की ज़रूरत है।

यह भी ध्यान दें, प्रोग्राम को नॉन-स्पेस्ड पथ पर ले जाना एक विकल्प नहीं है।


यह भी काम नहीं करता है:

import os;
os.system("'C:\\Temp\\a b c\\Notepad.exe'");
raw_input();

स्वैप किए गए सिंगल / डबल कोट्स को नोट करें।

नोटपैड के पैरामीटर के साथ या उसके बिना, यह त्रुटि संदेश के साथ विफल हो जाता है

फ़ाइल नाम, निर्देशिका नाम या वॉल्यूम लेबल सिंटैक्स गलत है।


इसका प्रयोग करें: os.system(r'C:\temp\"a b c"\Notepad.exe') या यह:os.system('C:\\temp\\"a b c"\\Notepad.exe')
चैंजेर

भविष्य के आगंतुकों के लिए, यदि आप तर्क (उपप्रकार का उपयोग करके) के साथ एक ऐप चलाना चाहते हैं। आपको अपने तर्क को अंतरिक्ष से विभाजित करने और प्रत्येक को व्यक्तिगत रूप से पारित करने की आवश्यकता है। उदाहरण के लिए, यह एक बैट फाइल से है "C:\Program Files\GDAL\gdal_translate.exe" -ot byte -of GTIFF -scale -co PHOTOMETRIC=CMYK "cmyk-16.tif" "cmyk-8_out.tif":। पायथन में, यह बन जाता है ["C:\\Program Files\\GDAL\\gdal_translate.exe", "-ot", "byte", "-scale", "-co", "PHOTOMETRIC=CMYK", "input_cmyk-16.tif", "output_cmyk-8.tif"]:।
अकिनुरी

जवाबों:


297

subprocess.callविभिन्न गोले के सम्मेलनों से निपटने के साथ समस्याओं से बचना होगा। यह एक स्ट्रिंग के बजाय एक सूची को स्वीकार करता है, इसलिए तर्कों को अधिक आसानी से सीमांकित किया जाता है। अर्थात

import subprocess
subprocess.call(['C:\\Temp\\a b c\\Notepad.exe', 'C:\\test.txt'])

81
खिड़कियों में कच्चे तार का उपयोग करना बहुत सरल है: r "C: \ Temp \ abc \ Notepad.exe"
पियरेबीडीआर

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

1
इसके लिए विंडोज़ विधि os.spawn परिवार है, जिसका उपयोग इसके बजाय किया जा सकता है। उपप्रकार हालांकि अधिक पोर्टेबल है, और प्रक्रिया को नियंत्रित करने (इनपुट / आउटपुट आदि को कैप्चर करने) में अधिक लचीलापन प्रदान करता है, इसलिए इसे प्राथमिकता दी जाती है।
ब्रायन

6
@PierreBdr: एक ऐसा मामला है जहां रॉस्ट्रिंग काम नहीं करेगा: जहां आपको एक अनुगामी स्लैश की आवश्यकता होती है। जैसे r'c: \ foo \ bar \ '। दरअसल, इसके बजाय आगे स्लैश का उपयोग करना बेहतर है। ये विंडोज़ एपीआई के दौरान स्वीकार किए जाते हैं (हालांकि हमेशा कुछ शेल कमांड (जैसे कॉपी) द्वारा नहीं)
ब्रायन

1
अजगर के लिए> = 3.5 subprocess.callको subprocess.run docs.python.org/3/library/subprocess.html#older-high-level-api
gbonetti

67

यहाँ यह करने का एक अलग तरीका है।

यदि आप विंडोज़ का उपयोग कर रहे हैं, तो एक्सप्लोरर में फ़ाइल को डबल-क्लिक करने, या डॉस "स्टार्ट" कमांड के तर्क के रूप में फ़ाइल का नाम देने के लिए: फ़ाइल जो भी एप्लिकेशन (यदि कोई हो) के साथ खोली जाती है, तो उसका विस्तार जुड़ा हुआ है ।

filepath = 'textfile.txt'
import os
os.startfile(filepath)

उदाहरण:

import os
os.startfile('textfile.txt')

यह नोटपैड के साथ textfile.txt को खोलेगा यदि नोटपैड .txt फ़ाइलों के साथ जुड़ा हुआ है।


1
क्या * निक्स सिस्टम के लिए एक समान कार्य है?
रेमोनो

@Romeno: आप कोशिश कर सकते हैं: webbrowser.open("textfile.txt")यह एक पाठ संपादक खोलना चाहिए। यह भी देखें कि "दूसरा कार्यक्रम पूरी तरह से शुरू करें, जैसे कि मैं अभी 'इस पर डबल-क्लिक किया।"
बजे

मेरे सेटअप textfile.txt पर उद्धरण चिह्नों में होने की आवश्यकता है, जैसे:os.startfile('path\to\textfile.txt')
thdoan

34

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

os.system('"C://Temp/a b c/Notepad.exe"')

पायथन द्वारा 'का सेवन किया जाता है, जो तब CMD.EXE को "C: //Temp/abc/Notepad.exe" (विंडोज पथ के रूप में, कोई डबल-बैकस्लैम की आवश्यकता नहीं) से गुजरता है।


1
यह उस परिदृश्य में सबसे अच्छा लगता है जैसे os.system('curl URL > file')मैं वास्तव में बड़ी फ़ाइलों के लिए cURL के प्रगति मीटर को ताज़ा करना चाहता हूं।
Zach यंग

में बैकस्लैश के बाद पहले अक्षर विशेष अर्थ नहीं है (अर्थात \t, \nतो विशेष बैकस्लैश दोगुनी किया जाना चाहिए कि, आदि)। विंडोज पथ होने से इसका कोई लेना देना नहीं है।
एथन फुरमान

1
ध्यान दें कि यदि आप os.system()विंडोज़ पर उपयोग करते हैं तो cmd विंडो खुलेगी और तब तक खुली रहेगी जब तक कि आप उस प्रक्रिया को बंद नहीं कर देते जो उसने शुरू की थी। IMHO यह उपयोग करने के लिए बेहतर है os.startfile()
प्रातः

1
मत भूलनाimport os
33:३३ पर

मेरे लिए काम नहीं करता है stackoverflow.com/questions/56241616/…
गुलज़ार

19

कम से कम विंडोज 7 और पायथन 3.1 में, os.systemविंडोज चाहता है कि कमांड लाइन डबल-कोटेड हो अगर कमांड के रास्ते में जगह हो। उदाहरण के लिए:

  TheCommand = '\"\"C:\\Temp\\a b c\\Notepad.exe\"\"'
  os.system(TheCommand)

एक वास्तविक दुनिया का उदाहरण जो मुझे स्टम्पिंग कर रहा था वह वर्चुअलबॉक्स में ड्राइव को क्लोन कर रहा था। subprocess.callसमाधान ऊपर कुछ अधिकारों का उपयोग समस्या के कारण काम नहीं किया था, लेकिन जब मैं आदेश डबल-कोटेड, os.systemखुश हो गया:

  TheCommand = '\"\"C:\\Program Files\\Sun\\VirtualBox\\VBoxManage.exe\" ' \
                 + ' clonehd \"' + OrigFile + '\" \"' + NewFile + '\"\"'
  os.system(TheCommand)

वह यह था! मैं जाऊंगा subprocess, लेकिन कभी-कभी os.systemऔर os.popen(...).read()बस टाइप करने के लिए तेज़ होते हैं। BTW, आपको सिंगल के अंदर डबल कोट्स से बचने की जरूरत नहीं है, यानी '""C:\\Temp\\a b c\\Notepad.exe""'करेंगे।
टॉमाज़ गैंडर

9
import win32api # if active state python is installed or install pywin32 package seperately

try: win32api.WinExec('NOTEPAD.exe') # Works seamlessly
except: pass

और ऐसा लगता है कि इस पद्धति के साथ कोई उद्धरण की आवश्यकता नहीं है, जैसे win32api.WinExec ('pythonw.exe d: \ web2py \ web2py.py -K स्वागत') पृष्ठभूमि में web2py अनुसूचक शुरू करता है।
टिम रिचर्डसन

@ इब्राहल और क्या यह निष्पादन योग्य के लिए तर्कों को छोड़कर है? तो अगर आप चाहते हैं कि नोटपैड एक फाइल खोल दे या वह अलग हो जाए?
Sayth


3

मुझे संदेह है कि यह वही समस्या है जब आप विंडोज में शॉर्टकट का उपयोग करते हैं ... यह कोशिश करें:

import os;
os.system("\"C:\\Temp\\a b c\\Notepad.exe\" C:\\test.txt");

क्षमा करें, यह काम नहीं करता है, इसे प्रतिबिंबित करने के लिए संपादित प्रश्न।
लास वी। कार्लसन

मुझे लगता है कि विंडोज़ केवल "उद्धरण के लिए" के बजाय "का उपयोग करती है। यह संभवत: यदि आप इसे बदलते हैं तो यह काम करेगा। हालांकि, आप अभी भी समस्याओं में चलेंगे यदि आपके पास एम्बेडेड उद्धरण आदि हैं
ब्रायन

मैंने सोचा कि यह दोनों लिया, लेकिन आप शायद सही हैं। मुझे पता है कि यह (शेल कम से कम) दोहरे उद्धरण चिह्नों के साथ काम करता है।
मैथ्यू शार्ले

+1 यह सबसे अच्छा है, विंडोज़ एक्सपी, 2007 होम संस्करण ने अच्छी तरह से काम किया

0

मान लीजिए कि हम आपका Django वेब सर्वर (लिनक्स में) चलाना चाहते हैं कि आपके पथ (पथ = '/home/<you>/<first-path-section> <second-path-section>') के बीच जगह है , इसलिए निम्न कार्य करें:

import subprocess

args = ['{}/manage.py'.format('/home/<you>/<first-path-section> <second-path-section>'), 'runserver']
res = subprocess.Popen(args, stdout=subprocess.PIPE)
output, error_ = res.communicate()

if not error_:
    print(output)
else:
    print(error_)

[ नोट ]:

  • प्रवेश की अनुमति न भूलें: chmod 755 -R <'yor path'>
  • manage.py अवर्णनीय है: chmod +x manage.py

0

पायथॉन 3.7 के लिए, सबप्रोसेस.का उपयोग करें । Windows पथ को सरल बनाने के लिए कच्चे स्ट्रिंग का उपयोग करें:

import subprocess
subprocess.call([r'C:\Temp\Example\Notepad.exe', 'C:\test.txt'])

0

उप-प्रक्रिया की कोई आवश्यकता नहीं है, इसे केवल प्राप्त किया जा सकता है

GitPath = "C: \ Program Files \ Git \ git-bash.exe" # अनुप्रयोग फ़ाइल पथ इसके GITBASH os.startfile (GitPath) को प्रदर्शित करने में

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