2015-01-07 4 views
0

나는 시스템 프로그램을 호출하고 out.txt 파일에서 출력을 읽고, 그 출력 및 루프에서 작동하는 파이썬 스크립트가 있습니다. 그러나 작동하지 않으며 가까운 조사 결과 python 스크립트가 out.txt을 한 번 열어 본 다음 이전 사본에서 계속 읽는 것으로 나타났습니다. 파이썬 스크립트가 각 반복마다 파일을 다시 읽도록하려면 어떻게해야합니까? 나는 비슷한 질문을 여기에 보았지만 파이썬 스크립트가 프로그램과 함께 실행되고 호출되지 않고 솔루션이 작동하지 않습니다. 내가 루핑하기 전에 파일을 닫으려고했는데 아무 것도하지 않았다.디스크에서 파이썬 새로 고침 파일

편집 : 이미 닫은 후 열려고 시도했지만 작동하지 않았습니다.

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." 
+0

당신은 그것을 닫을 수 다시 엽니 다

foo.write('\n'+output) foo.flush() 
tdelaney

+0

매번 파일에 쓰고 있습니까? –

+0

이봐, 아직 거기 있니? 시스템 프로그램이 오래된'out.txt'를 지우고 새로운 것을 쓰게 될 가능성이 큽니다. 적어도 리눅스에서 열려있는 파일 핸들은 연결 해제 된 이전 파일을 가리키고 새로운 데이터를 보지 못합니다. 폐쇄/개방은 분명한 해결책이므로 작동하는지 알려주십시오. – tdelaney

답변

1

foo을 플러시해야 외부 프로그램이 최신 변경 사항을 볼 수 있습니다. 파일에 쓸 때 데이터는 로컬 프로세스에서 버퍼링되고 더 큰 블록으로 시스템에 전송됩니다. 이는 시스템 파일 업데이트가 상대적으로 비용이 많이 들기 때문에 수행됩니다. 귀하의 경우 minisat가 데이터를 볼 수 있도록 강제로 데이터를 플러시해야합니다.

import os 
from shutil import copyfile 
import subprocess 
import sys 

TEMP_CNF = "tmp.in" 
TEMP_SOL = "tmp.out" 
NULL = open(os.devnull, "wb") 

def all_solutions(cnf_fname): 
    """ 
    Given a file containing a set of constraints, 
    generate all possible solutions. 
    """ 
    # make a copy of original input file 
    copyfile(cnf_fname, TEMP_CNF) 

    while True: 
     # run minisat to solve the constraint problem 
     subprocess.call(["minisat", TEMP_CNF, TEMP_SOL], stdout=NULL,stderr=NULL) 

     # look at the result 
     with open(TEMP_SOL) as result: 
      line = next(result) 
      if line.startswith("SAT"): 
       # Success - return solution 
       line = next(result) 
       solution = [int(i) for i in line.split()] 
       yield solution 
      else: 
       # Failure - no more solutions possible 
       break 

     # disqualify found solution 
     with open(TEMP_CNF, "a") as constraints: 
      new_constraint = " ".join(str(-i) for i in sol) 
      constraints.write("\n") 
      constraints.write(new_constraint) 

def main(cnf_fname): 
    """ 
    Given a file containing a set of constraints, 
    count the possible solutions. 
    """ 
    count = sum(1 for i in all_solutions(cnf_fname)) 
    print("There are {} solutions.".format(count)) 

if __name__=="__main__": 
    if len(sys.argv) == 2: 
     main(sys.argv[1]) 
    else: 
     print("Usage: {} cnf.in".format(sys.argv[0])) 
+0

당신은 오타가 있지만 minista는 –

+0

이어야합니다. 고치세요. – tdelaney

0

당신이 (당신의 file_var을 가지고 file_var.close와 루프를 종료) : 여기에 코드입니다. 강하게

2015-01-09, 'stuff added' 
2015-01-09, 'stuff added'   # <-- this is when i just saved my update 
2015-01-10, 'stuff added again :)' # <-- my new output from file reads 

I는 :

for ... : 
    ga_file = open(out.txt, 'r') 
    ... do stuff 
    ga_file.close() 

아래 구현 데모

__author__ = '' 
import time 

var = 'false' 
while var == 'false': 
    out = open('out.txt', 'r') 
    content = out.read() 
    time.sleep(3) 
    print content 
    out.close() 

이 출력을 생성한다 (가능한 한 간단하게, 이것은 필요한 자이 코드 전부이다) 오류 메시지를 읽는 것이 좋습니다. 그들은 많은 정보를 가지고 있습니다.

전체 파일 이름은 디버그 목적으로 작성되어야한다고 생각합니다.

+0

어디에서'os.path.join (path, filename) + '.skv' '가 왔습니까? –

+0

죄송합니다. 프로젝트의 예제 코드를 사용했습니다. 나는 코드가 지금 당신이 좋아하는 것에 더 있다고 생각한다) – 25r43q

+0

Lol 나는 그것이 꽤 무작위로 보였다는 것을 단지 궁금해하고 있었다! –

1

가 나는 희망이 이해하기 좀 더 쉽게로 다시 썼다.
+0

감사합니다. 매우 유용합니다. 무슨 일이야? –

+0

"쉘 유틸리티"는 파일 복사, 이동 및 이름 변경에 유용한 기능을 포함하는 표준 라이브러리 모듈입니다. –

관련 문제