“WindowsError:[错误206]的文件名或扩展名是太长”运行的程序与子很多次后(“Wind

2019-09-17 10:48发布

我的Python程序准备输入,运行一个外部的Fortran代码,并在Windows HPC 2008环境处理的输出。 它的伟大工程,除非代码执行1042至45年时间之间的外部程序(通常情况下,问题较早收敛)。 在这种情况下,我得到一个异常:

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位置(例如\\服务器\共享\的Program.exe),标准输入是在只读模式打开文件的本地驱动器上,stdout是在写模式下打开文件的本地驱动器上和CWD是C上的本地路径:\驱动器。 我已经证实,没有一个参数子长度超过80个字符,即使限制应该是32,768,根据这个有点相关的帖子 。

我究竟做错了什么? 不知怎的,事情正在积累,当我跑了一千次才成为一个问题。

更新:

为了测试“打开的文件太多”的假设,我做了一个不同的可执行文件运行速度很快一个非常小的例子。 这里的主要区别是,标准输入和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()

Answer 1:

嗯....其实,我认为错误消息的文本是一个红色的鲱鱼。 我不知道是肯定的,但它似乎对我来说发生的事情是,你正在运行出的文件句柄。 从各种来源,似乎是规范的文件句柄限制大约2048个文件...这是奇怪的在2×1042个的子进程附近。 我不知道窗口Python解释器的内部,但我的猜测是,处理不被垃圾收集足够快,即使你关闭文件。 再次...这只是一个猜测...但也许是思维的另一条线,可能导致你的东西更确凿的和富有成效的。

与此同时,作为一种解决方法,可以通过具有调压过程,生成一个进程,这反过来又派生子进程使用旧的备用方式。 中间子具有确定的寿命(说...不超过1000级的子过程,它派生),它死之前。 当中间子期满时,调速器过程开始一个新的。 这是一个黑客...而且是一个笨拙的一个...但它的工作。 (IIRC,使用Apache Web服务器有一个子进程可能多少请求处理某种自毁限制。)

反正...好运和快乐编码。



文章来源: “WindowsError: [Error 206] The filename or extension is too long” after running a program very many times with subprocess