File.readlines () не возвращает никаких строк; возможно, файл не открывается - PullRequest
0 голосов
/ 29 мая 2020

Я работаю над созданием скрипта для автоматической настройки дисков в системах linux. Одна из моих функций не работает, и, хоть убей, я не могу понять почему.

Я протестировал код на pythontutor.com без ошибок. Когда я запускаю код на своей машине, я не получаю ошибок, но вместо функции, возвращающей данные из файла "disks.txt", я получаю пустые словари.

Я пытался добавить операторы печати в разные моменты процесса, чтобы увидеть, что происходит, но ничего не печатает.

Вот моя функция:

def check_for_disks():
    cmd = 'lsblk -l -o name,mountpoint'.split()
    driveDict = {}
    finalDict = {}
    diskFile = open("disks.txt", "w+")
    subprocess.Popen(cmd, stdout=diskFile)
    diskFile.close()
    diskFile = open("disks.txt", "r+")
    for line in diskFile.readlines():
        dictItem = line.split()
        try:
            driveDict[dictItem[0]] = dictItem[1]
        except(IndexError):
            driveDict[dictItem[0]] = "No MountPoint Defined"
    diskFile.close()
    for k, v in driveDict.items():
        if 'sd' in k:
            finalDict[k] = v
        else:
            pass
    return finalDict

Эта часть работает безупречно и создает файл, который я хочу, с соответствующей информацией:

def check_for_disks():
    cmd = 'lsblk -l -o name,mountpoint'.split()
    driveDict = {}
    finalDict = {}
    diskFile = open("disks.txt", "w+")
    subprocess.Popen(cmd, stdout=diskFile)
    diskFile.close()

Эта часть не работает:

diskFile = open("disks.txt", "r+")
for line in diskFile.readlines():

Вроде просто файл не открывается. Я проверил файл с помощью ls -la и увидел, что с его разрешениями все в порядке, aka -rw-rw-r -

Я пробовал с open ("disks.txt", "a +") как diskFile :

Я пробовал варианты «r», «r +», «a +»

Я запускал скрипт sudo

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

ПОЖАЛУЙСТА, СПАСИ МЕНЯ, Я СРАЖАЮСЬ

1 Ответ

0 голосов
/ 29 мая 2020

TL; DR: файл пуст, когда вы его открываете.

Следующая команда открывает новый поток, и новый поток начинает запись в этот файл.

subprocess.Popen(cmd, stdout=diskFile)

Но в то же время, когда файл начинает создаваться, вы начинаете читать файл. Два потока делают эту команду быстрее, но я не думаю, что вам это нужно. Просто дождитесь завершения файла перед его чтением.

что-то вроде этого, должно делать то, что вы хотите

p = subprocess.Popen(cmd, stdout=diskFile)
p_status = p.wait() #finish writing the file before starting to read it

Сообщите мне, действительно ли вам нужно несколько потоков или у этого фрагмента есть какие-либо проблемы.

...