Python:将子进程Popen stdout重定向到日志文件

时间:2017-08-03 15:18:22

标签: python scala logging subprocess

我运行了一个python进程,将logger对象配置为在日志文件中打印日志。

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

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

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

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

所以,查询归结为,如何获取shell命令的stdout输出在日志文件中运行subprocess模块。即使有更好的方法来实现这一点而不是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)

1 个答案:

答案 0 :(得分:0)

使用

mvn -Phadoop_yarn -Dhadoop.version=2.7.3 clean package -DskipTests

接着是

p = subprocess.Popen(...)

然后stdout, stderr = p.communicate() stdout将包含来自子进程'输出流的输出字节。然后,您可以记录stderr值。