我运行了一个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)
答案 0 :(得分:0)
使用
mvn -Phadoop_yarn -Dhadoop.version=2.7.3 clean package -DskipTests
接着是
p = subprocess.Popen(...)
然后stdout, stderr = p.communicate()
和stdout
将包含来自子进程'输出流的输出字节。然后,您可以记录stderr
值。