के साथ प्रोग्राम चलाने के बाद फ़ाइल नाम या एक्सटेंशन बहुत लंबा है" मेरा पायथन प्रोग्राम इनपुट तैयार करता है, बाहरी फोरट्रान कोड चलाता है, और विंडोज एचपीसी 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()
धन्यवाद। मुझे यकीन है कि आप सही हैं कि यह एक लाल हेरिंग है। मैंने फ़ाइलों की संख्या की परिकल्पना का परीक्षण किया (ऊपर अद्यतन देखें) और सरल खाली stdin/stdouts के साथ समस्या को पुन: उत्पन्न नहीं कर सका। वास्तव में निर्णायक नहीं है। – partofthething