2017-08-03 435 views
1

我有一个Python进程运行,有一个记录器对象配置为在日志文件中打印日志。Python:重定向子进程Popen标准输出到日志文件

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

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

的问题是,只要蟒蛇进程退出,它挂起外壳,这涉及到生活后,才明确地运行stty sane命令。我的猜测是,这是由于scala脚本输出到shell并因此shell挂起而导致的,因为它的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) 
+0

尝试删除'shell = True'? –

+0

如果我删除此参数,它甚至不会运行,它会因FileNotFoundError失败 – greperror

+0

您应该删除'shell = True'并调试'FileNotFoundError'。你是否将完整路径传递给可执行文件?向我们展示您的命令的实际内容。 – senderle

回答

0
使用

p = subprocess.Popen(...) 

随后

stdout, stderr = p.communicate() 

然后stdoutstderr将包含从子输出流的输出字节。然后您可以记录stdout的值。

相关问题