2009-11-30 1 views
14

मैंने कई तर्कों के साथ पायथन के माध्यम से एक प्रक्रिया को कॉल करने का प्रयास किया। बैच फ़ाइल को निष्पादित करना मेरे लिए ठीक काम करता है लेकिन इसे पायथन में अनुवाद करने से मुझे चीख आती है। यहाँ बैच फ़ाइल की सामग्री:एक सबप्रोसेस निष्पादित करने में विफल रहता है

"C:\Program Files\bin\cspybat" "C:\Program Files\bin\armproc.dll" "C:\Program Files\bin\armjlink.dll" "C:\Documents and Settings\USER\Desktop\CAL\testing\Verification\FRT\Code\TC1\Output\Genericb\Debug\Exe\Gen.out" --download_only --backend -B "--endian=little" "--cpu=Cortex-M3" "--fpu=None" "-p" "C:\Program Files\CONFIG\debugger\ST\iostm32f10xxb.ddf" "--drv_verify_download" "--semihosting" "--device=STM32F10xxB" "-d" "jlink" "--drv_communication=USB0" "--jlink_speed=auto" "--jlink_initial_speed=32" "--jlink_reset_strategy=0,0" 

निष्पादन योग्य है कि बैच फ़ाइल द्वारा चलाया जाता है cspybat नाम पर है। निष्पादन योग्य का आउटपुट जानकारी प्रदान करता है: All parameters after - are passed to the back end वापसी करें।

यह भी ध्यान रखें कि कुछ पैरामीटर तार हैं और कुछ नहीं।

समाधान

वह मेरे लिए अब काम करता है:

""" MCU flashing function""" 
params = [r"C:\Program Files\bin\cspy", 
      r"C:\Program Files\bin\arpro.dll", 
      r"C:\Program Files\bin\arjink.dll", 
      r"C:\Documents and Settings\USER\Desktop\Exe\GenerV530b.out", 
      "--download_only", "--backend", "-B", "--endian=little", "--cpu=Cort3", "--fpu=None", "-p", 
      r"C:\Program Files\CONFIG\debugger\ST\iostm32f10xxb.ddf", 
      "--drv_verify_download", "--semihosting", "--device=STM32F10xxB", "-d", "jlink", "--drv_communication=USB0", 
      "--jlink_speed=auto", "--jlink_initial_speed=32", "--jlink_reset_strategy=0,0" ] 
print(subprocess.list2cmdline(params)) 
p = subprocess.Popen(subprocess.list2cmdline(params)) 
+0

की तरह कुछ का उपयोग करें यदि आप कुछ वास्तविक कोड है कि आप उपयोग पोस्ट कर सकते हैं? –

+0

नीचे देखें ....... – binaryguy

+1

@ wanderameise: ऐसी जानकारी पोस्ट न करें जो प्रश्न को "उत्तर" के रूप में स्पष्ट करे। यह एक जवाब नहीं है। यह महत्वपूर्ण जानकारी है जो प्रश्न का हिस्सा होना चाहिए ताकि हम मदद कर सकें। कृपया अपने गैर-उत्तर को हटाएं, और अतिरिक्त जानकारी के साथ अपने प्रश्न को अपडेट करें। –

उत्तर

22

Windows में एक बैच फ़ाइल निष्पादित करने के लिए:

from subprocess import Popen 
p = Popen("batchfile.bat", cwd=r"c:\directory\containing\batchfile") 
stdout, stderr = p.communicate() 

आप बैच फ़ाइल निष्पादित करने के लिए नहीं करना चाहते हैं , बल्कि पाइथन से सीधे अपने प्रश्न में कमांड निष्पादित करें, आपको पॉपन के पहले तर्क के साथ थोड़ा प्रयोग करने की आवश्यकता है।

सबसे पहले, पहला तर्क या तो स्ट्रिंग या अनुक्रम हो सकता है।

तो आप या तो लिखने:

p = Popen(r'"C:\Program Files\Systems\Emb Work 5.4\common\bin\run" "C:\Program Files\Systems\Emb Work 5.4\arm\bin\mpr.dll" ... ...', cwd=r"...") 

या

p = Popen([r"C:\Program Files\Systems\Emb Work 5.4\common\bin\run", r"C:\Program Files\Systems\Emb Work 5.4\arm\bin\mpr.dll", ...], cwd=r"...") 
# ... notice how you don't need to quote the elements containing spaces 

प्रलेखन के अनुसार:

On Windows: the Popen class uses CreateProcess() to execute the child program, which operates on strings. If args is a sequence, it will be converted to a string using the list2cmdline() method. Please note that not all MS Windows applications interpret the command line the same way: list2cmdline() is designed for applications using the same rules as the MS C runtime.

तो अगर आप एक दृश्य का उपयोग करें, यह एक स्ट्रिंग में परिवर्तित हो जाएगा । मैं शायद पहले अनुक्रम के साथ प्रयास करता हूं, तब से आपको रिक्त स्थान वाले सभी तत्वों को उद्धृत नहीं करना होगा (list2cmdline() आपके लिए यह करता है)।

समस्या निवारण के लिए, मैं अनुशंसा करता हूं कि आप अपना अनुक्रम subprocess.list2cmdline() पर पास करें और आउटपुट जांचें।

संपादित करें:

क) एक साधारण पायथन लिपि (testparams.py) इस तरह बनाएं::

import subprocess 
params = [r"C:\Program Files\Systems\Emb Work 5.4\common\bin\run.exe", ...] 
print subprocess.list2cmdline(params) 

ख) भागो

यहाँ अगर मैं तुम्हें थे मैं क्या कर करेंगे कमांड लाइन (python testparams.py) से स्क्रिप्ट, आउटपुट को दूसरी कमांड लाइन पर कॉपी और पेस्ट करें, एंटर दबाएं और देखें कि क्या होता है।

सी) यदि यह काम नहीं करता है, तो पायथन फ़ाइल संपादित करें और इसे तब तक दोहराएं जब तक यह काम न करे।

+0

आपके दूसरे प्रस्ताव के संबंध में: [त्रुटि 1 9 3]% 1 मान्य Win32 एप्लिकेशन – binaryguy

+0

एक कोड स्निपेट के साथ अपना प्रश्न अपडेट करें जो त्रुटि को पुन: उत्पन्न करता है। – codeape

+0

आईटी काम करता है !!! बहुत खुबस!! धन्यवाद दोस्त! – binaryguy

0

सबसे पहले, आप उन सभी उद्धरणों की आवश्यकता नहीं है। तो उन्हें हटा दें। आपको केवल पैरामीटर के चारों ओर उद्धरणों की आवश्यकता होती है जिनके पास फ़ाइल नाम होता है जब उस फ़ाइल नाम में एक स्थान होता है (बेवकूफ, विंडोज अक्सर ऐसा करता है)।

आपके पैरामीटर केवल स्ट्रिंग्स की एक सूची हैं, जिनमें से कुछ को उद्धरण की आवश्यकता है। चूंकि विंडोज पथ विभाजक के लिए गैर-मानक \ का उपयोग करता है, इसलिए इन नामों के लिए "कच्चे" तारों का उपयोग करें।

params = [ 
    r'"C:\Program Files\Systems\Emb Work 5.4\arm\bin\mpr.dll"', 
    r'"C:\Program Files\Systems\Emb Work 5.4\arm\bin\ajl.dll"', 
    r'"C:\Documents and Settings\USER\Desktop\abc.out"', 
    "--backend", 
    "-B", 
    "--endian=little", 
    "--cpu=Cortex", 
    "--fpu=None", 
    "-p", 
    r'"C:\Program Files\unknown\abc.ddf"', 
    "--drv_verify_download", 
    "--semihosting", 
    "--device=STM32F10xxB", 
    "-d", 
    "jjftk", 
    "--drv_communication=USB0", 
    "--speed=auto", 
    "--initial_speed=32", 
    "--reset_strategy=0,0"] 

program = r'"C:\Program Files\Systems\Emb Work 5.4\common\bin\run"' 
subprocess.Popen([program]+params) 
+0

विंडोज एरर: [त्रुटि 3] सिस्टम निर्दिष्ट पथ नहीं मिला – binaryguy

+0

कौन सा? कृपया अपना प्रश्न अपडेट करके विवरण प्रदान करें। –

+1

@ एसएलॉट: मुझे विश्वास है कि आपको रिक्त स्थान वाले पैराम को उद्धृत नहीं करना चाहिए (इस मामले में पैराम [0], [1], [2] और [9]। Subprocess.list2cmdline स्ट्रिंग के निर्माण के दौरान आवश्यक पैरामीटर उद्धृत करेगा CreateProcess – codeape