Запись файла на флешку в Linux с Python? - PullRequest
2 голосов
/ 27 июля 2011

У меня гораздо больше проблем, чем ожидалось, при записи в файл, чем я ожидал. У меня есть небольшой одноплатный компьютер, работающий на ручном процессоре со встроенным дистрибутивом Angstrom. Я пишу заявку на это с Python. Приложение должно обнаружить USB-накопитель, а затем выгрузить файл на него. Проблема, с которой я сталкиваюсь, заключается в том, что даже когда мой скрипт, кажется, пишет файл правильно, и файл, кажется, находится там, используя "ls" и "cat" в Linux, когда я вынимаю флешку и пытаюсь посмотреть файл в Windows или другом дистрибутиве Linux пуст или чаще всего вообще отсутствует. Мое приложение многопоточное. Я создаю / media / mymntpnt как root (каталог.)

Любая помощь приветствуется.

Вот некоторые фрагменты моего кода:

Эта часть используется для идентификации USB-накопителя:

class MediaScanner():
    def __init__(self):
        self.lok = thread.allocate_lock()
        self.running = True
        self.started = False

    def register_cb(self,func):
        self.cb = func

    def start(self):
        if not self.started:
            thread.start_new_thread(self.scan_thread,())

    def scan_thread(self):
        self.quit = False
        self.started = True
        last_devices = []
        while self.running:
            devices = self.scan_media()
            if (devices != last_devices):
                self.cb(devices) #call the callback as its own thread
            last_devices = devices

            time.sleep(0.1)

        self.quit = True    

    def stop(self):
        self.running = False
        while(not self.quit):
            pass
        return True

    def is_running(self):
        return self.running


    def scan_media(self):
        with self.lok:
            partitionsFile = open("/proc/partitions")
            lines = partitionsFile.readlines()[2:]#Skips the header lines
            devices = []
            for line in lines:
                words = [x.strip() for x in line.split()]
                minorNumber = int(words[1])
                deviceName = words[3]
                if minorNumber % 16 == 0:
                    path = "/sys/class/block/" + deviceName
                    if os.path.islink(path):
                        if os.path.realpath(path).find("/usb") > 0:
                            devices.append('/dev/'+deviceName)

            partitionsFile.close()

            return devices

А вот пример моего скрипта для записи файла:

from mediascanner import *
from util import *
from database import *
from log import *

ms = MediaScanner()

devices = ms.scan_media()

print devices

if devices:
    db = TestDatabase(init_tables=False)

    data = db.get_all_test_data()



    for device in devices:
        print device
        mount_partition(get_partition(device))
        write_and_verify('/media/mymntpnt/test_'+get_log_file_name(),flatten_tests(data))
        unmount_partition()

А вот мои вспомогательные функции:

def write_and_verify(f_n,data):
    f = file(f_n,'w')
    f.write(data)
    f.flush()
    f.close()
    f = file(f_n,'r')
    verified = f.read()
    f.close()
    return  verified == data and f.closed


def get_partition(dev):
    os.system('fdisk -l %s > output' % dev)
    f = file('output')
    data = f.read()
    print data
    f.close()
    return data.split('\n')[-2].split()[0].strip()

def mount_partition(partition):
    os.system('mount %s /media/mymntpnt' % partition)


def unmount_partition():
    os.system('umount /media/mymntpnt')

1 Ответ

0 голосов
/ 04 августа 2011

Ошибка в функции записи, которая должна синхронизировать файл перед его закрытием, как показано ниже. Чтение всегда будет успешным, потому что данные уже находятся в оперативной памяти. Вы можете попробовать что-то другое, чтобы проверить это, например, проверить bytecount.

def write_and_verify(f_n,data):
    f = file(f_n,'w')
    f.write(data)
    f.flush()
    os.fsync(f.fileno())
    f.close()
    f = file(f_n,'r')
    verified = f.read()
    f.close()
    return  verified == data and f.closed

Если вы получили информацию о файле, подобную этой finfo = os.stat(f_n), то вы можете сравнить finfo.st_size с числом байтов, которое вы ожидали записать.

...