Python Subprocess存储调用输出到文件

时间:2015-12-01 18:25:58

标签: python linux subprocess stdout

我已经尝试过没有运气的方法,Docs也没有多说存储输出。我试过以下内容:

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:不能cd到/ var / log / messagelog”。希望这是我在这里犯的一个新手错误,所以非常感谢这里的另一双眼睛。

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

2 个答案:

答案 0 :(得分:4)

使用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 常量:

@async

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

答案 1 :(得分:0)

你应该使用

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

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

检查文档。