【问题标题】:Python Subprocess storing call output to filePython子进程将调用输出存储到文件
【发布时间】:2016-03-05 18:58:16
【问题描述】:

我已经尝试过没有运气看到的方法,并且文档没有太多关于存储输出的说明。我尝试了以下方法:

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。

【问题讨论】:

  • stderr 去哪儿了?
  • 您遇到权限错误?还有cd /var/log/messagelog 应该做什么?
  • 目录不存在,运行命令时出现“cd: can't cd to /var/log/messagelog”语句,因此此处没有权限被拒绝错误。它应该尝试 cd 到那个目录,如果它得到“cant cd”错误,它应该创建那个目录。否则会通过
  • 你有写入/var/log的权限吗?您是否以 root 身份运行程序?
  • 如果您在 Python 2.6 或更早版本上需要 subprocess.check_output(),请参阅 What's a good equivalent to python's subprocess.check_call that returns the contents of stdout?

标签: python linux subprocess stdout


【解决方案1】:

使用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 都将引发,这可能是也可能不是你想要的。

【讨论】:

  • e.errno == errno.EEXIST
  • 这个答案中的第一个建议可能应该被删除,因为它会产生竞争条件。或者至少,它应该提到它创造了一个竞争条件。否则,很容易使用,因为代码看起来更简单(尽管实际上它的安全性要低得多)。
  • @eestrada,我添加了一个链接到一个讨论它的答案,它的安全/不安全程度取决于 OP 正在做什么。
【解决方案2】:

你应该使用

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

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

查看文档。

【讨论】:

  • 这根本不是子进程的工作
  • OP 已声明Docs dont say much about storing the Output.。 sp.call 确实不保存输出。 Popen 为您提供了一种方法。
  • 是的,但是 os 模块是检查或创建目录的正确方法,而不是解析子进程的输出
  • 没有争论。 OP 滥用 python 运行 shell 命令。
  • Popen 不能用于 cd 因为它是一个命令,因此为什么首先使用 call 。同意帕德里亚克
猜你喜欢
  • 2021-05-17
  • 1970-01-01
  • 2016-07-18
  • 2014-04-22
  • 2011-06-26
  • 2012-02-11
  • 1970-01-01
  • 2021-02-06
  • 2017-01-05
相关资源
最近更新 更多