【发布时间】: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