2 Stimmen

Das Schreiben von Dateien geschieht nicht dann, wenn es im Programmablauf vorgesehen ist

Dieses Problem ist für mich nicht neu. Von C über PERL bis hin zu Python auf Windows Mobile, Windows XP und anderen Windows-Versionen tritt dieses Problem immer wieder auf und geht mir auf die Nerven.

Jetzt in meinem neuesten Skript passiert es wieder. Um konkreter zu werden: Ich habe in Python ein triviales Skript programmiert. Nun schreibt das Skript korrekt in die Datei, wenn es vom Debugger aus ausgeführt wird, aber außerhalb des Debuggers funktioniert es nicht korrekt. Es schreibt nicht in die Datei, wenn es sollte. Ich verwende Python 2.6 mit Eclipse und pydev.

Dies ist der Code

import httplib2
import thread

ht = httplib2.Http();
list = []
k = 0

def check(proxy, port):
    global list
    global k
    try:
        head = ht.request(proxy, 'HEAD')
    except:
        return
    k = k + 1
    list.append(proxy)
    list.append(port)

def OnListCaller(ProxyList, OutFile, NListLen):
    global list
    global k
    filei = open(ProxyList, 'r')
    fileo = open(OutFile, 'a')

    while 1:
        proxy = filei.readline()
        if not proxy: continue
        port = filei.readline()

        proxy = proxy.rstrip()
        port = port.rstrip()

        thread.start_new(check, (proxy, port,))

        if k >= NListLen:
            for t in list:
                fileo.write(t + "\n")
            list = []
            fileo.close()
            fileo = open(OutFile, 'a')
            k = 0

OnListCaller('C:\proxy\input.txt', 'C:\proxy\checked.txt', 1)   

Das Problem liegt im OnListCaller bei der if k>=NListLen. Die Datei sollte aktualisiert werden, wenn k >= dann ein bestimmter Wert ist. Vielen Dank an alle.

8voto

James Punkte 23616

Erinnere dich daran, was deine Mutter dir beigebracht hat:

immer spülen()

(in Python, file_object.flush() gefolgt von os.fsync(file_object.fileno()) )

2voto

James Punkte 23616

Bezüglich des Codes: Es sieht so aus, als ob sich das eigentliche Problem auf Threads und nicht auf Dateien bezieht:

Während Sie diesen Code ausführen:

    for t in list:
        fileo.write(t + "\n")
    list = []
    fileo.close()
    fileo = open(OutFile, 'a')
    k = 0

list von den von Ihnen erzeugten Threads geändert wird. Ich weiß nicht genau, wie "for x in y" mit Threads funktioniert, aber ich kann mir vorstellen, dass die Elemente, die der Liste hinzugefügt werden, nachdem die for-Schleife das erste Mal ausgeführt wurde, nicht berücksichtigt werden.

Um dieses Problem zu lösen, benötigen Sie einen Mutex für list die Sie für die gesamte Dauer dieser for-Schleife sperren (bis Sie die Liste geleert haben) und die Sie immer dann sperren, wenn Sie der Liste ein Element hinzufügen.

1voto

19021programmer Punkte 435
import httplib2
import thread
import os
import sys

ht = httplib2.Http();

def check(proxy, port, OutFile):
    global list
    try:
        head = ht.request(proxy, 'HEAD')
    except:
        return
    fileo = open(OutFile, 'a')
    fileo.write(proxy+"\n")
    fileo.write(port+"\n")
    sys.stdout.flush()
    os.fsync(fileo.fileno())
    fileo.close()

def OnListCaller(ProxyList, OutFile, NListLen):
    global list
    filei = open(ProxyList, 'r') 
    while 1:
        proxy = filei.readline()
        if not proxy: continue
        port = filei.readline()

    proxy = proxy.rstrip()
    port = port.rstrip()

    #TODO: regleaza pentru unix cand o sa fie nevoie

    thread.start_new(check, (proxy, port, OutFile,))

OnListCaller('C:\proxy\input.txt', 'C:\proxy\checked.txt', 1)

Dies ist der festgelegte Code.

0voto

ghostdog74 Punkte 305138

Wenn Sie die Datei mit einem Dateihandle in Python geöffnet haben, denken Sie daran, sie zu schließen, wenn Sie fertig sind. z.B.

f=open("file")
....
f.write(....)
f.close()

0voto

Alexei Sholik Punkte 6927

Offensichtlich vergessen Sie, die Datei zu schließen, wenn Sie die Arbeit daran beendet haben. Wenn Sie den Inhalt der Datei überprüfen wollen, bevor Sie sie schließen, rufen Sie die Funktion flush() Methode. Beispiel:

file = open("hello.txt", "a")
file.write(...)
file.flush()      // force write on the disk
file.close()      // finished using the file, close it

Überprüfen Sie Ihren Code, in dem nicht alle geöffneten Dateien geschlossen sind.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X