Неизвестная ошибка Python - PullRequest
1 голос
/ 08 марта 2011

Следующий код взят из скрипта Python, который я пишу, который должен модифицировать массив демонов в файле Arch Linux rc.conf. Однако при запуске я получаю ValueError о том, что операция:

for line in rc:

Невозможно выполнить с закрытым файлом. Я могу что-то упустить, но, насколько я могу судить, файл не закрыт. Благодарю.

rc = open('/etc/rc.conf', 'r')
tmp = open('/etc/rctmp', 'w')
for line in rc:
    if 'DAEMONS' in line and '#' not in line and 'dbus' not in line:
        line = line.split('=')[1].strip()
        line = line[1:len(line)-1]
        line = line.split()
        tmp = line[1:]
        line = [line[0]]
        line = ' '.join(line + ['dbus'] + tmp)
        line = 'DAEMONS = (' + line + ')'
tmp.write(line)
rc.close()
tmp.close()
#os.remove('/etc/rc.conf')
#shutil.move('/etc/rctmp', '/etc/rc.conf')

Ответы [ 2 ]

4 голосов
/ 08 марта 2011

Вы переназначаете на tmp примерно на 8 строк ниже. Тогда tmp больше не является файлом. В этот момент его счетчик ссылок может упасть до нуля, поэтому Python закрывает его. Пока вы все еще пытаетесь перебрать строки в другом файле.

Используйте здесь другое имя переменной:

...
tmp = line[1:]       # rename 'tmp' here
line = [line[0]]
line = ' '.join(line + ['dbus'] + tmp)  # and also here
...

[Edit ...]

Я только что заметил, что вы читаете из rc и еще не написали в tmp, когда получаете сообщение об ошибке. Хотя при попытке tmp.write() вы получите сообщение об ошибке, вероятно, имя переменной не является причиной проблемы, о которой вы сообщили.

0 голосов
/ 08 марта 2011

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

from contextlib import nested

with nested(open('/etc/rc.conf', 'r'), open('/etc/rctmp', 'w')) as managers:
    rc_file, tmp_file = managers
    for line in rc_file:
        if 'DAEMONS' in line and '#' not in line and 'dbus' not in line:
            line = line.split('=')[1].strip()
            line = line[1:len(line) - 1]
            line = line.split()
            tmp = line[1:]
            line = [line[0]]
            line = ' '.join(line + ['dbus'] + tmp)
            line = 'DAEMONS = (' + line + ')'
        tmp_file.write(line)

РЕДАКТИРОВАТЬ: ответ @ dappawit также является правильным, так как, когда строка заканчивается тем, что удовлетворяет условию if, ваш код будет перекрывать переменную tmp, привязав к ней строку, а затемпосле выхода из условного блока будет выдана еще одна ошибка в строке string object doesn't have a write method.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...