它可以打印输出,但是为什么不写文件呢?

时间:2019-09-23 07:33:40

标签: python subprocess

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 个答案:

答案 0 :(得分:1)

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)

答案 1 :(得分:1)

您应该使用上下文管理器打开文件。使用此解决方案,您的文件将被关闭。

代码:

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文件的内容相同。

答案 2 :(得分:0)

为避免此类错误,请在代码中使用with open()。它将自动关闭文件。