2012-05-23 13 views
6

के साथ प्रोग्राम चलाने के बाद फ़ाइल नाम या एक्सटेंशन बहुत लंबा है" मेरा पायथन प्रोग्राम इनपुट तैयार करता है, बाहरी फोरट्रान कोड चलाता है, और विंडोज एचपीसी 2008 पर्यावरण में आउटपुट को संसाधित करता है। यह बहुत अच्छा काम करता है, जब तक कि कोड बाहरी कार्यक्रम को 1042-1045 बार (आमतौर पर समस्या पहले परिवर्तित हो) के बीच निष्पादित करता है। इन स्थितियों में, मैं एक अपवाद प्राप्त करें:"विंडोज एरर: [त्रुटि 206] उपरोक्त

WindowsError: [Error 206] The filename or extension is too long

हालांकि, फ़ाइल नाम के लिए पथ नहीं है समय के साथ बढ़ रहा है। यह सिर्फ निर्देशिका की सफाई कर रहा है और फिर से चल रहा है।

कोड यह रहा:

inpF = open(inName) 
outF = open(localOutName,'w') 
p = subprocess.Popen(pathToExe,shell=False,stdin=inpF,stdout=outF,cwd=runPath) 
stdout, stderr = p.communicate() 
outF.close() 
inpF.close() 

pathToExe एक निरंतर स्ट्रिंग एक यूएनसी स्थान की ओर इशारा करते है (उदाहरण के लिए \\ सर्वर \ साझा \ program.exe), stdin एक पर केवल-पठन मोड में एक खुली फ़ाइल है स्थानीय ड्राइव, stdout स्थानीय ड्राइव पर लेखन मोड में एक खुली फ़ाइल है, और सीडब्ल्यूडी सी: \ ड्राइव पर एक स्थानीय पथ है। मैंने पुष्टि की है कि this somewhat related post के अनुसार, उप-प्रोसेस के लिए कोई भी तर्क 80 वर्णों से अधिक नहीं है, भले ही सीमा 32,768 होनी चाहिए।

मैं क्या गलत कर रहा हूं? किसी तरह कुछ जमा हो रहा है कि जब मैं हजारों बार दौड़ता हूं तो केवल एक समस्या बन जाती है।

अद्यतन:

"बहुत सारी फ़ाइलें खुले" परिकल्पना का परीक्षण करने के लिए, मैं एक बहुत ही छोटा सा उदाहरण है कि बहुत जल्दी एक अलग निष्पादन के साथ चलता है बनाया है। यहां मुख्य अंतर यह है कि stdin और stdout यहां केवल खाली फ़ाइलें हैं, जबकि पिछले मामले में, वे दोनों बड़ी फाइलें हैं। इस मामले में, कोड 2000 रनों के लिए ठीक है, जबकि पहले ~ 1042 पर विफल रहता है। तो यह सिर्फ इतना नहीं है कि कई फाइलें हैं। शायद बहुत सारी बड़ी फाइलें खुली हैं?

import subprocess 
for i in range(nRuns): 
    if not (i % (nRuns/10.0)): 
     print('{0:.2}% complete'.format(i/float(nRuns)*100)) 
    inpF=open('in.txt') 
    outF=open('out.txt','w') 
    p = subprocess.Popen('isotxsmerge.exe',shell=False,stdin=inpF, 
           stdout=outF,cwd='.') 
    stdout, stderr = p.communicate() 
    outF.close() 
    inpF.close() 

उत्तर

4

हममम .... वास्तव में, मुझे लगता है कि त्रुटि संदेश पाठ एक रेड हेरिंग है। मुझे निश्चित रूप से पता नहीं है, लेकिन ऐसा लगता है कि क्या हो रहा है कि आप फ़ाइल हैंडल से बाहर हो रहे हैं। विभिन्न स्रोतों से, ऐसा लगता है कि कैनोलिक फ़ाइल हैंडल सीमा लगभग 2048 फाइलें है ... जो आपके 1042 उपप्रोसेसेस के 2 एक्स के पड़ोस में उत्सुकता से है। मुझे विंडोज़ पायथन दुभाषिया के आंतरिक पता नहीं है, लेकिन मेरा अनुमान है कि हैंडल कचरा नहीं जा रहे हैं, भले ही आप फ़ाइलों को बंद कर रहे हों। दोबारा ... यह सिर्फ एक अनुमान है ... लेकिन शायद यह सोचने की एक और पंक्ति है जो आपको कुछ और निर्णायक और उत्पादक बना सकती है।

इस बीच, एक काम के रूप में, आप एक गवर्नर प्रक्रिया होने के द्वारा पुराने स्टैंड-बाय दृष्टिकोण का उपयोग कर सकते हैं जो एक प्रक्रिया को जन्म देता है, जो बदले में उपप्रोसेस उत्पन्न करता है। इंटरमीडिएट उपप्रोसेस के पास मरने से पहले निर्धारित जीवनकाल (कहें ... 1000 से अधिक उपप्रोसेस जो इसे उत्पन्न करता है) है। जब मध्यवर्ती उपप्रवाह समाप्त हो जाता है, तो राज्यपाल प्रक्रिया एक नया शुरू होता है। यह एक हैक है ... और उस पर एक बेकार है ... लेकिन यह काम करता है। (आईआईआरसी, अपाचे वेब सर्वर पर कुछ प्रकार की आत्म-विनाश सीमा होती है, जिस पर उप-प्रक्रिया संभाल सकता है।)

वैसे भी ... शुभकामनाएं और खुश कोडिंग।

+0

धन्यवाद। मुझे यकीन है कि आप सही हैं कि यह एक लाल हेरिंग है। मैंने फ़ाइलों की संख्या की परिकल्पना का परीक्षण किया (ऊपर अद्यतन देखें) और सरल खाली stdin/stdouts के साथ समस्या को पुन: उत्पन्न नहीं कर सका। वास्तव में निर्णायक नहीं है। – partofthething

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