【问题标题】:Writing a file to a USB stick in linux with Python?使用Python在Linux中将文件写入USB记忆棒?
【发布时间】:2023-03-17 05:17:01
【问题描述】:

我在写入文件时遇到的麻烦比我预期的要多得多。我有一台小型单板计算机,运行在带有 Angstrom 嵌入式发行版的 arm 处理器上。我正在用 python 为它编写一个应用程序。应用程序应该检测到 U 盘,然后将文件转储到它。我遇到的问题是,即使我的脚本似乎可以正确写入文件,并且当我移除 USB 记忆棒并尝试查看Windows 或其他 linux 发行版中的文件是空的,或者更常见的是根本不存在。我的应用程序是多线程的。我将 /media/mymntpnt 创建为根(目录)。

感谢任何帮助。

这是我的代码的一些 sn-ps:

这部分是我用来识别U盘的:

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')

【问题讨论】:

  • 你试过sync和/或pmountpumount吗?有点头脑风暴。
  • 也看看os.fdatasync(在linux上可能相当于os.system('fsync ...)
  • 所以有时您确实会在计算机上看到该文件?
  • umount 总是成功吗?检查返回值。由于您的应用程序是多线程的,因此可能是分区繁忙且无法卸载。只是猜测......
  • 这个问题与 Python 关系不大。由于性能问题,操作系统正在缓存数据而不是将其写入 U 盘。您必须确保卸载驱动器已成功完成。

标签: python linux file usb-drive


【解决方案1】:

错误在于在关闭文件之前应该同步文件的写入函数,如下所示。读取将始终成功,因为数据已经在 RAM 中。您可能想尝试不同的方法来验证它,例如检查字节数。

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 与您预期写入的字节数进行比较。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-29
    • 1970-01-01
    • 2013-09-14
    • 2018-10-20
    • 1970-01-01
    • 2018-07-05
    • 1970-01-01
    相关资源
    最近更新 更多