2010-03-04 18 views
11

मैं उपप्रक्रिया मॉड्यूल से Popen समारोह का उपयोग कर रहा एक कमांड लाइन उपकरण निष्पादित करने के लिए:subprocess.Popen args पैरामीटर की अधिकतम लंबाई क्या है?

subprocess.Popen(args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=False, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0) 

उपकरण मैं उपयोग कर रहा हूँ फ़ाइलें है कि यह तो प्रक्रियाओं की एक सूची लेता है। कुछ मामलों में, फाइलों की यह सूची बहुत लंबी हो सकती है। क्या तर्क पैरामीटर अधिकतम लंबाई को खोजने का कोई तरीका है?

Traceback (most recent call last): 
    File "dump_output_sopuids.py", line 68, in <module> 
    uid_map = create_sopuid_to_path_dict_dcmdump(dicom_files) 
    File "dump_output_sopuids.py", line 41, in create_sopuid_to_path_dict_dcmdump 
    dcmdump_output = subprocess.Popen(cmd,stdout=subprocess.PIPE).communicate(0)[0] 
    File "c:\python26\lib\subprocess.py", line 621, in __init__ 
    errread, errwrite) 
    File "c:\python26\lib\subprocess.py", line 830, in _execute_child 
    startupinfo) 
WindowsError: [Error 206] The filename or extension is too long 

वहाँ एक सामान्य तरीके से इस अधिकतम लंबाई को खोजने के लिए है: के साथ फ़ाइलों की एक बड़ी संख्या उपकरण के लिए पारित किया जा रहा है, मैं निम्न त्रुटि मिल रहा है? मुझे msdn पर निम्न आलेख मिला: Command prompt (Cmd. exe) command-line string limitation लेकिन मैं मान में हार्ड कोड नहीं चाहता हूं। मैं एकाधिक कॉल में कमांड को तोड़ने के लिए रन टाइम पर मान प्राप्त करूंगा।

Windows XP पर अजगर 2.6 का उपयोग कर रहा 64

संपादित करें: जोड़ने कोड उदाहरण

paths = ['file1.dat','file2.dat',...,'fileX.dat'] 
cmd = ['process_file.exe','+p'] + paths 
cmd_output = subprocess.Popen(cmd,stdout=subprocess.PIPE).communicate(0)[0] 

समस्या होती है क्योंकि paths सूची में प्रत्येक वास्तविक प्रवेश आमतौर पर एक बहुत लंबे फ़ाइल पथ है और वहाँ उनमें से कई हजार हैं।

मुझे process_file.exe पर एकाधिक कॉल में कमांड को तोड़ने में कोई फर्क नहीं पड़ता। मैं अधिकतम लंबाई प्राप्त करने के लिए एक सामान्य तरीका ढूंढ रहा हूं जो कि तर्क हो सकता है, इसलिए मुझे पता है कि प्रत्येक रन के लिए कितने पथ भेजना है।

+0

क्या आप आर्ग के लिए क्या प्रदान का एक उदाहरण मूल्य प्रदान कर सकता है? –

+0

मैं पार्टी के लिए काफी देर हो चुकी हूं लेकिन मैं यह जोड़ना चाहता हूं कि मुझे कई प्रविष्टियों को जोड़ने के बाद मेरे पाथ पर्यावरण चर के कारण बहुत ही त्रुटि हो रही है। – RedX

उत्तर

9

यदि आप खोल = गलत हो रहे हैं, तो Cmd.exe खेल में नहीं आता है।

विंडोज़ पर, उपप्रोसेस नई प्रक्रिया बनाने के लिए Win32 API से CreateProcess फ़ंक्शन का उपयोग करेगा। इस फ़ंक्शन के लिए documentation बताता है कि दूसरा तर्क (जो subprocess.list2cmdline द्वारा निर्मित है) की अधिकतम लंबाई 32,768 वर्ण है, जिसमें यूनिकोड शून्य वर्ण को समाप्त कर रहा है। यदि lpAplicationName NULL है, तो lpCommandLine का मॉड्यूल नाम भाग MAX_PATH वर्णों तक सीमित है।

अपना उदाहरण देखते हुए, मैं निष्पादन योग्य (तर्क [0]) के लिए एक मूल्य प्रदान करने और पहले पैरामीटर के लिए तर्क का उपयोग करने का सुझाव देता हूं। यदि CreateProcess दस्तावेज़ और सबप्रोसेस मॉड्यूल स्रोत कोड का मेरा पठन सही है, तो यह आपकी समस्या का समाधान करना चाहिए।

[संपादित करें: आर्ग हटाया [1:] एक विंडोज़ मशीन और परीक्षण पर मेरे हाथ पाने के बाद बिट]

+0

मुझे यकीन नहीं है कि क्या मैं पहले पैरामीटर के लिए तर्क [1:] का उपयोग करने के बारे में आपके सुझाव का पालन करता हूं। मैंने कोड प्रश्न के साथ अपना प्रश्न अपडेट किया है। CreateProcess –

+0

पर लिंक और टिप के लिए +1 मैंने कोशिश की लेकिन मैं अभी भी एक सीमा मार रहा हूं: subprocess.Popen (cmd [1:] + पथ, निष्पादन योग्य = cmd [0], stdout = subprocess.PIPE)। अभी के लिए मैं 32000 का उपयोग कमांड लम्बाई के लिए सीमा के रूप में कर रहा हूं और मेरे आदेश को कई बार कॉल कर रहा हूं और सभी आउटपुट एकत्र कर रहा हूं। मैं 32000 हार्ड कोड में सक्षम नहीं होना चाहता हूं लेकिन पर्यावरण से वह मूल्य प्राप्त करूंगा। –

+0

जैसा कि मैंने उद्धृत दस्तावेज़ में उल्लेख किया है, 32768 सीमा को CreateProcess primitive में हार्ड कोड किया गया है (16 बिट हस्ताक्षरित पूर्णांक के लिए ऊपरी सीमा है, यानी 2 ** 15)। जैसा कि सूची 2 सीएमडी कमांड लाइन बनाते समय उद्धरण और रिक्त स्थान जोड़ देगा, आप योग से पहले ([लेन (ए) तर्कों से पहले उस सीमा को हिट करेंगे]) 2 ** 15 तक पहुंचता है। क्या आपके तर्क निष्पादन योग्य को पास करने के लिए वाइल्डकार्ड का उपयोग करने का कोई तरीका नहीं है?(वाइल्डकार्ड आमतौर पर विंडोज़ के तहत निष्पादन योग्य द्वारा संसाधित होते हैं) –

संबंधित मुद्दे