gpt4 book ai didi

python - "WindowsError: [Error 206] The filename or extension is too long"使用子进程多次运行程序后

转载 作者:可可西里 更新时间:2023-11-01 13:26:41 28 4
gpt4 key购买 nike

我的 python 程序在 Windows HPC 2008 环境中准备输入、运行外部 FORTRAN 代码并处理输出。它工作得很好,除非代码在 1042-1045 次之间执行外部程序(通常问题会更早收敛)。在这些情况下,我得到一个异常(exception):

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 是指向 UNC 位置的常量字符串(例如\\server\shared\program.exe),stdin 是本地驱动器上以只读模式打开的文件,stdout 是以写模式打开的文件本地驱动器,cwd 是 C:\驱动器上的本地路径。我已经确认子进程的所有参数都不超过 80 个字符,即使根据 this somewhat related post 限制应该是 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()

最佳答案

嗯....实际上,我认为错误消息文本是在转移注意力。我不确定,但在我看来,发生的事情很可能是文件句柄用完了。从各种来源来看,规范的文件句柄限制似乎约为 2048 个文件……奇怪的是,这大约是 1042 个子进程的 2 倍。我不知道 windows python 解释器的内部结构,但我的猜测是句柄的垃圾收集速度不够快,即使您正在关闭文件。再次重申......这只是一个猜测......但也许这是另一种思路,可能会引导你得出更有结论和更有成效的东西。

与此同时,作为变通方法,您可以使用旧的备用方法,方法是让调控器进程生成一个进程,然后再生成子进程。中间子进程在它死亡之前有一个确定的生命周期(比如......它产生的不超过 1000 个子进程)。当中间子进程到期时,调控器进程启动一个新的。这是一个技巧……而且是一个笨拙的技巧……但它确实有效。 (IIRC,apache 网络服务器曾经对子进程可以处理的请求数量有某种自毁限制。)

无论如何......祝你好运,编码愉快。

关于python - "WindowsError: [Error 206] The filename or extension is too long"使用子进程多次运行程序后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10724642/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com