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

python不会让另一个程序在运行时将测试报告写入.txt文件,python,Python,我有一个自动RAM测试仪,为它测试的每个模块编写测试报告。RAM测试仪会无限期地添加到测试报告中。我想做的是让Python阅读报告并查找单词“PASS”和RAM的速度 找到这两个单词后,我需要Python写入串行端口并清除报告,以便.txt文件中没有任何内容。这样,它就可以循环并读取下一个测试模块的下一个报告 代码都是编写的,而且当Python运行时,RAM测试仪不会将其报告写入.txt文件。我已经创建了一个小程序,它从RAM测试仪中获取一份测试报告,并每隔3秒将其写入.txt文件,效果非常好

我有一个自动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测试仪的测试报告之一:

测试编号:1
模块:DDR2 256Mx72 2GB 2R(8)@2x333MHZ 1.8V
(在2x400MHz下测试)
地址(rowxcol.):14 x 10
数据(rankxbit):2 x 72
内部银行:8家
突发:模式=顺序,长度=8
交流参数:CL=5,AL=0,Trcd=5,Trp=5
来自SPD的序列号:a128f4f3
测试回路#:1
测试模式:wA、wD、mt、mX、mC、mY、S.O.E
##通过:循环1##
运行时间:00:00:53.448
日期:2014年9月26日,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)

非常感谢您,我确实需要让它工作起来,所以非常感谢。

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

如果您需要有关Windows中共享和锁定的详细信息,请参阅MSDN上函数中的
dwShareMode
说明。(当然,您不是在调用
CreateFile
,您只是在使用Python的
open
,它为您调用
CreateFile
,或者在旧版本中,调用本身调用
CreateFile


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

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

您还必须添加一些代码来处理由于两个程序试图同时打开和写入文件的竞争条件而导致的
操作错误,但这只是一个简单的
尝试:
/
,除了:
外,还有一个循环


你能不能打开一个共享权限更大的文件

当然。例如,您可以使用来调用
CreateFile
WriteFile
而不是使用Python的
open
write
包装器,然后您可以为
dwShareMode
传递任何想要的参数

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


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

为什么打开同一路径的另一个句柄只是为了截断它?为什么不干脆,比如说,
file.truncate(0)
?在
r+
模式下打开
文件时,再执行一次
打开
,意味着即使没有其他程序尝试使用相同的文件,也会与自己发生冲突


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

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

如果您需要有关Windows中共享和锁定的详细信息,请参阅MSDN上函数中的
dwShareMode
说明。(当然,您不是在调用
CreateFile
,您只是在使用Python的
open
,它为您调用
CreateFile
,或者在较旧的版本中,调用