2015-12-01 33 views
0

我试过的方法,我没有看到运气,文件没有多说关于存储输出。我试过如下:Python子过程存储呼叫输出到文件

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 

我想要做的就是让程序识别该目录不存在。 ive暂时替代了一个简单的打印声明。我不能使用check_output,因为在30个不同的系统上更新Python对此非常不切实际。打印行应该产生:“cd:不能cd到/ var/log/messagelog”。希望这是我在这里创造的一个新秀错误,所以在这里另一组眼睛将不胜感激。

编辑:我想在这里做的是看看目录是否存在,如果不存在,然后创建目录。可能还有其他方法可以做到这一点,但我所看到的一切都指向了子进程。 CD不是一个程序,因此我必须使用呼叫代替Popen。

+0

stderr在哪里? – PTBNL

+0

您收到权限错误?另外'cd/var/log/messagelog'应该是干什么的? –

+0

该目录不存在,并且当运行该命令时出现“cd:can not cd to/var/log/messagelog”语句,因此没有权限在此处拒绝错误。它应该尝试cd到该目录,并且如果它得到“cant cd”错误,它应该创建该目录。否则它会通过 – bladexeon

回答

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 

这将只会捕获一个目录存在的错误,任何其他OSError将被提出,这可能是也可能不是你想要的。

+2

'e.errno == errno.EEXIST' –

+0

@AndreaCorbellini,的确,编辑 –

+2

这个答案中的第一个建议可能应该被删除,因为它会产生竞争条件。或者至少应该提到它会造成竞争状况。否则,使用起来会很诱人,因为代码看起来更简单(尽管实际上它远不是那么安全)。 – eestrada

0

您应该使用

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

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

检查文档。

+1

这不是子任务的工作 –

+0

OP已经声明'Docs不会说太多关于存储输出的信息。 sp.call确实不保存输出。 Popen为您提供了一种方法。 – Oz123

+0

是的,但是os模块是检查或创建目录的正确方式,不解析子过程的输出 –