python不允许其他程序在运行时将测试报告写入.txt文件

2024-06-15 05:55:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个自动RAM测试仪,它为它测试的每个模块编写一个测试报告。RAM测试人员不断地向测试报告中添加数据。我要做的是让Python阅读报告并查找单词“PASS”和RAM的速度。在

一旦找到这两个单词,我需要Python写入串行端口并清除报告,以便.txt文件中没有任何内容。这样,它就可以循环并读取下一个测试模块的下一个报告。在

除了Python运行时RAM测试人员不会将其报告写入.txt文件之外,所有代码都是编写的。我创建了一个小程序,从RAM测试仪获取一个测试报告,每3秒将其写入.txt文件,这非常好用。在

我正在工作的程序打开.txt文件,找到我的另一个程序写在其中的文本,找到这两个关键字,删除它们,循环执行,直到我想关闭程序为止。我已经用它解决了一些问题,方法是注释掉代码块,直到它运行

file = open("yup.txt", "r+")
txt = file.read()

部分,则RAM测试仪无法编写报告。我认为这个循环不断地访问/读取.txt文件,这会把它搞砸……不过还不太确定。而且Python根本不会崩溃,它只是停在循环中,所以到目前为止我没有问题。在

以下是我遇到问题的代码:

^{pr2}$

以下是RAM测试仪的测试报告之一:

^{3}$

我不确定这是否有用,但这里是我编写的一个小程序,用来模拟RAM测试人员将其测试报告写入.txt文件。我仍然不明白为什么这个工作和RAM测试人员写测试报告有问题。。。在

import os
import time

Q = '''Test No.: 1
Module      : DDR2 256Mx72 2GB 2R(8)@2x333MHZ 1.8V
        (Tested at 2x400MHz)
Addr.(rowxcol.) : 14 x 10
Data (rankxbit) :  2 x 72
Internal Banks  :  8
Burst   : Mode=Sequential, Length=8
AC parameters   : CL=5, AL=0, Trcd=5, Trp=5
S/N from SPD    : a128f4f3
Test Loop # : 1
Test Pattern    : wA, wD, mt, mX, mC, mY, S.O.E
## PASS:   Loop 1 ##
Elapsed Time    : 00:00:53.448
Date    : 09/26/2014, 16:07:40'''

x = 1
while x == 1:
    host = open('yup.txt' , 'w')
    host.write(Q)
    host.close()
    time.sleep(3)

提前非常感谢,我真的需要让这个工作起来,所以非常感谢。在


Tags: 模块文件代码test程序txthost报告
1条回答
网友
1楼 · 发布于 2024-06-15 05:55:38

问题是在Windows上,两个程序通常不能同时打开同一个文件。当您试图以wr+模式打开该文件时,您要求它以独占方式打开该文件,这意味着如果其他人已经打开了该文件,它将失败,并且它将阻止任何其他人打开该文件。在

如果您想了解Windows中共享和锁的详细信息,请参阅MSDN上的^{}函数中的dwShareMode说明。(当然,您没有调用CreateFile,您只是使用Python的open,它为您调用CreateFile,或者在旧版本中,调用{a2},它本身就是CreateFile。)


那么,你怎么解决这个问题呢?在

最简单的方法就是不打开文件。打开文件,写入文件,然后再次关闭它。(另外,既然您从未写入file,为什么首先要以r+模式打开它?)在

您还必须添加一些代码来处理由两个程序试图同时打开和写入文件的竞争条件引起的OSError,但这只是一个简单的try:/except:及其周围的循环。在


你能用更大的权限打开文件吗?在

当然可以。例如,您可以使用^{}来调用CreateFile和{},而不是使用Python的open和{}包装,然后您可以为dwShareMode传递任何参数。在

但想想这意味着什么。如果两个程序都试图同时写入文件,会发生什么情况?谁赢了?如果幸运的话,会丢失一个测试输出。如果不走运,脚本A在脚本B编写测试输出的过程中清空了该文件,您将得到一个无法解析的垃圾文件,并抛出一个无法解释且难以重现的异常。那么,这真的是你想要的吗?在


同时,你的代码中还有一些奇怪的东西。在

为什么要打开同一路径的另一个句柄来截断它?为什么不干脆说,file.truncate(0)?在r+模式下打开file时再做一次open意味着你最终会和自己发生冲突,即使没有其他程序试图使用同一个文件。在

您还依赖于文件指针的一些非常奇怪的行为。你已经阅读了file中的所有内容。你还没有回到开头,也没有重新打开文件。您已经截断了文件,并用大约相同数量的数据覆盖了它。所以当您再次read()时,您应该什么也得不到,或者如果测试报告的长度不总是完全相同的话,可能会得到几行。事实上,您实际上得到了整个文件,这是Windows在其C stdio库中所做的一些奇怪事情的意外结果。在

相关问题 更多 >