Chương trình python của tôi chuẩn bị đầu vào, chạy mã FORTRAN bên ngoài và xử lý các kết quả đầu ra trong môi trường Windows HPC 2008. Nó hoạt động rất tốt, trừ khi mã thực hiện chương trình bên ngoài từ 1042-1045 lần (Thông thường vấn đề hội tụ trước đó). Trong những tình huống này, tôi nhận được một ngoại lệ:"WindowsError: [Error 206] Tên tệp hoặc phần mở rộng quá dài" sau khi chạy chương trình rất nhiều lần với subprocess
WindowsError: [Error 206] The filename or extension is too long
Tuy nhiên, đường dẫn đến tên tập tin là không ngày càng tăng theo thời gian. Nó chỉ làm sạch thư mục và chạy lại.
Dưới đây là các mã:
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 là một chuỗi liên tục trỏ đến một vị trí UNC (ví dụ \\ server \ chia sẻ \ program.exe), stdin là một tập tin mở trong chế độ read-only trên ổ đĩa cục bộ, stdout là một tệp mở trong chế độ ghi trên ổ đĩa cục bộ và cwd là một đường dẫn cục bộ trên ổ C: \. Tôi đã xác nhận rằng không có đối số nào cho quy trình con dài hơn 80 ký tự, mặc dù giới hạn được cho là 32,768, theo số this somewhat related post.
Tôi đang làm gì sai? Bằng cách nào đó một cái gì đó đang tích lũy mà chỉ trở thành một vấn đề khi tôi chạy hơn một ngàn lần.
UPDATE:
Để kiểm tra "quá nhiều tập tin mở" giả thuyết, tôi đã thực hiện một ví dụ rất nhỏ mà chạy rất nhanh chóng với một thực thi khác nhau. Sự khác biệt chính ở đây là stdin và stdout chỉ là các tệp rỗng ở đây, trong khi trong trường hợp trước, chúng đều là các tệp lớn. Trong trường hợp này, mã chạy tốt cho 2000 lần chạy, trong khi mã lỗi trước đó là ~ 1042. Vì vậy, nó không chỉ là có nhiều tập tin. Có thể có quá nhiều tệp lớn đang mở?
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()
Cảm ơn. Tôi cá là anh đúng là cá trích đỏ. Tôi đã thử nghiệm giả thuyết về số lượng tệp (xem cập nhật ở trên) và không thể tạo lại vấn đề với stdin/stdouts rỗng đơn giản. Không thực sự kết luận. – partofthething