【问题标题】:Python : Redirecting subprocess Popen stdout to log filePython:将子进程Popen stdout重定向到日志文件
【发布时间】:2018-01-11 07:18:40
【问题描述】:

我有一个 python 进程正在运行,有一个配置为在日志文件中打印日志的记录器对象。

现在,我正在尝试使用 Python 的 subprocess 模块通过 python 进程调用 scala 脚本。

subprocess.Popen(scala_run_command, stdout=subprocess.PIPE, shell=True)

问题是,每当 python 进程退出时,它都会挂起 shell,它只有在显式运行 stty sane 命令后才会生效。我的猜测是,这是因为 scala 脚本输出到 shell 导致 shell 挂起,因为它的 stdout [它的 stdout 中的某些东西导致 shell 失去理智]。

出于同样的原因,我想尝试将要捕获的 scala 运行脚本的输出放在我的默认日志文件中,这似乎不会使用多种方式发生。

所以,查询归结为,如何在日志文件中通过subprocess 模块获取shell 命令的stdout 输出。即使有更好的方法而不是subprocess, run,我也很想知道这些想法。

代码的当前状态如下所示。

__echo_command = 'echo ":load %s"' 
__spark_console_command = 'spark;' 
def run_scala_script(self, script): 
     echo_command = self.__echo_command % script 
     spark_console_command = self.__spark_console_command 
     echo_result = subprocess.run(echo_command, stdout=subprocess.PIPE, shell=True) 
     result = subprocess.run(spark_console_command, stdout=subprocess.PIPE, shell=True, input=echo_result.stdout) 
     logger.info('Scala script %s completed successfully' % script) 
     logger.info(result.stdout)

【问题讨论】:

  • 尝试删除shell=True
  • 如果我删除此参数,它甚至不会运行,它会因 FileNotFoundError 而失败
  • 您应该删除shell=True 并调试FileNotFoundError。您是否将完整路径传递给可执行文件?向我们展示您的命令的实际内容。

标签: python scala logging subprocess


【解决方案1】:

使用

p = subprocess.Popen(...)

紧随其后

stdout, stderr = p.communicate()

然后stdoutstderr 将包含来自子进程的输出流的输出字节。然后,您可以记录 stdout 值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-08
    • 2012-07-14
    • 1970-01-01
    • 2014-09-13
    • 1970-01-01
    • 2015-01-01
    • 2010-11-18
    • 2019-04-12
    相关资源
    最近更新 更多