2016-04-16 9 views
1

Ich habe zwei Funktionen, A und B:Lesen/Schreiben von Dateien zwischen Methoden

def A(): 
    if (exists("temp/my_file.txt"): 
     my_file = open("temp/my_file.txt", "r") 
     # Do stuff 
     my_file.close() 
     remove("temp/my_file.txt") 

def B(): 
    my_file = open("temp/my_file.txt", "w") 
    # Do other stuff 
    my_file.close() 

Diese Funktionen zu trennen Skripte geschrieben werden und unabhängig ausgeführt werden. B() erstellt die Datei, die A() lesen und dann löschen soll. Allerdings stoße ich dabei auf verschiedene Probleme (zB Error 2). Ich habe versucht, mit posixfile, die nicht in Windows funktioniert, Lockfile, die mir Importfehler gibt, und ich habe versucht, die Datei in ein temporäres Verzeichnis zu schreiben, während ich es in B() benutze und dann verschiebe es zurück, wenn ich A() will um es zu lesen und zu löschen.

Könnte ich einen Einblick bekommen, was vor sich geht und wie ich das beheben kann?

+0

Was ist das Problem? Es ist möglich, gleichzeitig in derselben Datei zu schreiben/zu lesen, ohne dass ein Problem auftritt. –

+0

@ChristophTerasa Das ist mein Punkt; Ich bin mir nicht sicher, was los ist. Aber ich weiß, dass ich auch kein gleichzeitiges Lesen/Schreiben möchte. – Woody1193

+0

OP, Sie sollten die 'mit öffnen (" temp/my_file.txt ") als f:' Syntax für das anmutige Öffnen und Schließen von Dateien verwenden. – BallpointBen

Antwort

1

Während es durchaus möglich ist, in eine Datei zu lesen, in die von einem anderen Thread geschrieben wird, ist es für beide Threads nicht möglich, die Datei zu löschen, ohne einen Fehler zu verursachen.

Wenn beispielsweise der Lese-Thread die Datei löschte, würden die Schreibvorgänge fehlschlagen, weil die Datei nicht mehr existiert. Das klingt nach einer Situation, in der es besser ist, eine einfache Nachrichtenwarteschlange zu verwenden, die einfachste ist wahrscheinlich lpush/rpop wirklich, es ist viel einfacher als Datei io.

Wenn Sie dies mit redis zu tun, waren

import redis 
def A(): 
    rdb = redis.Redis() 
    while True: 
     item = rdb.rpop('somekey') 
     # do stuff 

und der Schreiber wird

import redis 
def B(): 
    rdb = redis.Redis() 
    while True: 
     # do stuff 
     rdb.lpush('somekey',item) 

RPOP (und lpop) wird für Daten zur Verfügung werden warten. Wenn Sie die Schleife stoppen möchten, drücken Sie einen speziellen Wert als Signal

+0

Müssen nicht beide Methoden Teil desselben Skripts sein? – Woody1193

+0

Also habe ich mir die Redis-Dokumentation angeschaut, aber ich verstehe das nicht. Könnten Sie bitte einen Code bereitstellen? – Woody1193

+0

müssen Sie das Python verwenden redis https://redis-py.readthedocs.org/en/latest/ die Dokumentation sieht knapp aus, weil es wirklich nichts zu tun ist. – e4c5

Verwandte Themen