Он выводит на печать, но почему не записывает в файл? - PullRequest
0 голосов
/ 23 сентября 2019
import subprocess
f = open("sum.txt","a")
def execute(cmd):
        popen = subprocess.Popen(cmd, stdout=subprocess.PIPE, universal_newlines=True)
        for stdout_line in iter(popen.stdout.readline, ""):
            yield stdout_line 
        popen.stdout.close()
        return_code = popen.wait()
        if return_code:
            raise subprocess.CalledProcessError(return_code, cmd)




for uses in execute(['ls','-ltr']):
    f.write(uses)
    print(uses)

Ответы [ 3 ]

1 голос
/ 23 сентября 2019

Вы должны использовать context-manager, чтобы открыть файл.С этим решением ваш файл будет закрыт.

Код:

import subprocess


def execute(cmd):
        popen = subprocess.Popen(cmd, stdout=subprocess.PIPE, universal_newlines=True)
        for stdout_line in iter(popen.stdout.readline, ""):
            yield stdout_line
        popen.stdout.close()
        return_code = popen.wait()
        if return_code:
            raise subprocess.CalledProcessError(return_code, cmd)


with open("sum.txt", "a") as opened_file:
    for uses in execute(['ls', '-ltr']):
        opened_file.write(uses)
        print(uses)

Выход:

>>> python3 test.py 
total 96

-rw-rw-r-- 1 milanbalazs users  637 Jul 29 12:30 README.md

drwxrwxr-x 4 milanbalazs users 4096 Jul 29 12:30 admin

-rwxrwxr-x 1 milanbalazs users 1706 Jul 29 12:30 bash_unit_test.sh

содержимое файла sum.txt такое же.

1 голос
/ 23 сентября 2019

Вам нужно закрыть файл после записи в него после завершения цикла for

for uses in execute(['ls','-ltr']):
    f.write(uses)

f.close()

Это безопаснее в блоке try ... finally, так как он закроетфайл, даже если при выполнении операций с файлом произошла ошибка.

try:
    f = open("sum.txt","a")
    for uses in execute(['ls','-ltr']):
        f.write(uses)
finally:
    f.close()

Или еще лучше, используя оператор with, поскольку он закроет файл после выполнения оператора

with open("sum.txt","a") as f:
    for uses in execute(['ls','-ltr']):
        f.write(uses)
0 голосов
/ 23 сентября 2019

Чтобы избежать ошибок такого типа, используйте with open() в коде.Он автоматически закроет файл.

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