【发布时间】:2015-03-05 22:40:40
【问题描述】:
我有一个 python 脚本,它调用系统程序并从文件out.txt 读取输出,对该输出进行操作,然后循环。但是,它不起作用,仔细调查表明,python 脚本只打开一次out.txt,然后继续从那个旧副本中读取。如何让 python 脚本在每次迭代时重新读取文件?我在 SO 上看到了一个类似的问题,但它是关于一个与程序一起运行的 python 脚本,而不是调用它,并且解决方案不起作用。我尝试在循环返回之前关闭文件,但它没有做任何事情。
编辑: 我已经尝试关闭和打开,它没有工作。代码如下:
import subprocess, os, sys
filename = sys.argv[1]
file = open(filename,'r')
foo = open('foo','w')
foo.write(file.read().rstrip())
foo = open('foo','a')
crap = open(os.devnull,'wb')
numSolutions = 0
while True:
subprocess.call(["minisat", "foo", "out"], stdout=crap,stderr=crap)
out = open('out','r')
if out.readline().rstrip() == "SAT":
numSolutions += 1
clause = out.readline().rstrip()
clause = clause.split(" ")
print clause
clause = map(int,clause)
clause = map(lambda x: -x,clause)
output = ' '.join(map(lambda x: str(x),clause))
print output
foo.write('\n'+output)
out.close()
else:
break
print "There are ", numSolutions, " solutions."
【问题讨论】:
-
可以关闭再打开。
-
你每次都写入文件吗?
-
嘿,你还在吗?系统程序很可能会删除旧的
out.txt并写入一个新的。至少在 linux 上,打开的文件句柄将指向旧的未链接文件,并且永远不会看到新数据。由于关闭/打开是显而易见的解决方案,您能告诉我们它是否有效吗? -
@tdelaney 它应该覆盖 out.txt。我正在使用 minisat 通过将旧解决方案乘以 -1 并将其附加到输入文件来计算 SAT 问题的解决方案数量。所以算法是minisat输入输出,将输出乘以-1,附加到输入,重复。问题是初始读取后输出不会改变。我确实在循环结束时将其关闭并重新打开,但它不起作用。我在我的问题中发布了代码。
-
一些事情要尝试...在运行之前执行
if os.path.isfile("out"): os.remove("out")并临时将stdout 和err 传输到一个文件中,看看是否发生了其他一些坏事。