gpt4 book ai didi

python - 使用 Python 在 Linux 中将文件写入 U 盘?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:12:06 25 4
gpt4 key购买 nike

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

感谢任何帮助。

这是我的一些代码片段:

这部分是我用来识别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')

最佳答案

错误出在写入函数中,它应该在关闭文件之前同步文件,如下所示。读取总是会成功,因为数据已经在 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 与您期望写入的字节数进行比较.

关于python - 使用 Python 在 Linux 中将文件写入 U 盘?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6840711/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com