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

时间:2014-11-07 21:48:55

标签: python

我有一个自动RAM测试程序,可以为它测试的每个模块编写测试报告。 RAM测试仪不断无限地添加到测试报告中。我想要做的是让Python读取报告并查找单词“PASS”和RAM的速度。

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

除了Python运行时,代码全部写入RAM测试器不会将其报告写入.txt文件。我创建了一个小程序,它接收我从RAM测试器捕获的测试报告,并且每隔3秒将其写入.txt文件,并且完美无缺。

我正在处理的程序打开.txt文件,查找我的其他程序写入的文本,找到2个关键词,删除它们,循环并执行直到我关闭程序,就像我想要的那样它来。我通过注释掉代码块来完成一些麻烦,直到它运行

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

部分,然后RAM测试人员无法编写报告。我认为循环通过不断访问/读取.txt文件来搞砸它......但不太确定。此外,Python并没有崩溃,它只是坐在循环中,所以我没有遇到任何问题。

以下是我遇到麻烦的代码:

cache_size = os.lstat("yup.txt").st_size
print '\nsearching for number of characters in cache\n'
time.sleep(2)

if cache_size == 0:
    print ('0 characters found in cache!\n')
    time.sleep(1.5)
    print ('there is no data to process!\n')
    time.sleep(1.5)
    print ('waiting for RAMBot\n')

if cache_size > 0:
    print '%d characters found in cache!' % (cache_size)
    time.sleep(1.5)
    print ('\ndata analysis will now begin\n')

print('________________________________________________________________________________')

x = 1
while x == 1:

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

    if "PASS" and '@2x400MHZ' in txt:
        ser.write('4')
        print('DDR2 PC-6400 (800MHz) module detected')
        open('yup.txt' , 'w')
        file.close()

    if "PASS" and '@2x333MHZ' in txt:
        ser.write('3')
        print('DDR2 PC-5300 (667MHz) module detected')
        open('yup.txt' , 'w')
        file.close()

    if "PASS" and '@2x266MHZ' in txt:
        ser.write('2')
        print('DDR2 PC-4200 (533MHz) module detected')
        open('yup.txt' , 'w')
        file.close()

    if "PASS" and '@2x200MHZ' in txt:
        ser.write('1')
        print('DDR2 PC-3200 (400MHz) module detected')
        open('yup.txt' , 'w')
        file.close()

以下是RAM测试员的一份测试报告:

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

我不确定这是否有帮助,但这是我编写的小程序,用于模拟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)

非常感谢您提前,我真的需要让它工作,所以非常感谢。

1 个答案:

答案 0 :(得分:4)

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

如果您想了解Windows中的共享和锁定的详细信息,请参阅MSDN上CreateFile功能中的dwShareMode说明。 (当然你没有打电话给CreateFile,你只是使用Python open,它为你调用CreateFile - 或者在旧版本中,调用fopen,它本身调用CreateFile。)


那么,你是如何解决这个问题的?

最简单的做法就是不要让文件保持打开状态。打开文件,编写文件,然后再次关闭。 (另外,由于您从未写信至file,为什么首先要以r+模式打开它?)

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


你能用更宽松的共享打开文件吗?

不确定。例如,您可以使用pywin32来调用except:CreateFile,而不是使用Python的WriteFileopen包装,然后您就可以传递write所需的任何参数。

但想想这意味着什么。如果两个程序同时尝试写入文件会发生什么?谁赢?如果你很幸运,你将丢失一个测试输出。如果你运气不好,脚本A会在脚本B写入测试输出的过程中中断文件,然后你会得到一个垃圾文件,你无法解析并抛出难以理解且难以重现的异常。那么,这真的是你想要的吗?


与此同时,您的代码中还有其他一些奇怪的东西。

为什么要打开同一路径的另一个句柄只是为了截断它?为什么不呢,比方说,dwShareMode?在file.truncate(0)模式下仍然open打开的情况下执行另一个file意味着您最终会与自己发生冲突,即使其他程序没有尝试使用同一个文件。

你还依赖于文件指针的一些非常奇怪的行为。您已阅读r+中的所有内容。您还没有回头,或者重新打开了文件。您已截断该文件并使用大约相同数量的数据覆盖该文件。因此,当你再次file时,如果测试报告的长度始终不同,那么你什么都不会,或者可能只有几行。您实际获取整个文件的事实是Windows在其C stdio库中所做的一些奇怪事情的意外后果。