Python 子进程将调用输出存储到文件

Python Subprocess storing call output to file

我已经尝试过我所见过的方法,但不幸的是,文档没有太多关于存储输出的内容。我试过以下方法:

import subprocess
f = open(r'/var/log/temp.txt','w')
subprocess.call('cd /var/log/messagelog', shell=True, stdout=f)
f.close()
with open("/var/log/temp.txt",'r') as f:
    for line in f:
            print line

我要做的就是让程序识别该目录不存在。我暂时用一个简单的打印语句代替。我不能为此使用 check_output,因为在 30 个不同的系统上更新 Python 对此非常不切实际。打印行应产生:"cd: can't cd to /var/log/messagelog"。希望这是我在这里犯的一个新手错误,所以非常感谢这里的另一双眼睛。

编辑:我在这里要做的就是查看该目录是否存在,如果不存在,则创建该目录。可能还有其他方法可以做到这一点,但我所看到的一切都指向子流程。 cd 不是程序,因此我必须使用 call 而不是 Popen。

使用os模块检查目录是否存在,如果不存在则创建potential race condition:

import os
if not os.path.isdir('/var/log/messagelog'):
    os.mkdir('/var/log/messagelog')

您也可以尝试创建它并检查特定错误:

import os
try:
    os.mkdir(path)
except OSError as e:
    if e.errno == 17:
        print("dir exists")
    else:
         raise 

您可以使用 EEXIST 常量,如果它更易读的话:

import errno
import os

try:
    os.mkdir(path)
except OSError as e:
    if errno.EEXIST == e.errno:
        print("dir exists")
    else:
        raise 

这只会捕获目录存在错误,任何其他 OSError 都会被引发,这可能是也可能不是你想要的。

你应该使用

proc = sp.Popen(..., stdout=filehandle)
err = proc.communicator()

而不是 sp.call。输出将在 out.

查看文档。