繁体   English   中英

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

[英]"WindowsError: [Error 206] The filename or extension is too long" after running a program very many times with subprocess

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

WindowsError: [错误 206] 文件名或扩展名太长

但是,文件名的路径不会随时间增长。 它只是清理目录并再次运行。

这是代码:

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:\\ 驱动器上的本地路径。 我已经确认 subprocess 的所有参数都不超过 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()

嗯....实际上,我认为错误消息文本是一个红色的鲱鱼。 我不确定,但我觉得发生的事情是你的文件句柄用完了。 从各种来源,似乎规范文件句柄限制是大约2048个文件...奇怪的是在你的1042个子进程的2 x附近。 我不知道Windows python解释器的内部,但我的猜测是,即使你关闭文件,句柄也不会被垃圾收集得足够快。 再一次......这只是猜测...但也许这是另一种思路,可能会引导你找到更具决定性和生产力的东西。

同时,作为一种解决方法,您可以使用旧的备用方法,通过生成一个生成流程的调控器流程,从而生成子流程。 中间子流程在其死亡之前具有确定的寿命(例如,它产生的不超过1000个子流程)。 当中间子进程到期时,调控器进程启动一个新进程。 这是一个黑客......而且是一个笨拙的......但它确实有效。 (IIRC,apache Web服务器曾经对子进程可以处理的请求数量有某种自毁限制。)

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

我最近在导出到外部 python 应用程序时偶然发现了这个错误。 这是发生错误的示例代码:

subprocess.run([sys.executable, script_path, data_str])

这里 data_str 是一个 JSON 字符串。 事实证明,我试图传递的 JSON 字符串太长,导致了这个错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM