【发布时间】:2017-02-22 22:39:24
【问题描述】:
我有一个 python 脚本,用于使用 spark-submit 工具提交 spark 作业。我想执行命令并将输出实时写入 STDOUT 和日志文件。我在 ubuntu 服务器上使用 python 2.7。
这就是我的 SubmitJob.py 脚本中的内容
#!/usr/bin/python
# Submit the command
def submitJob(cmd, log_file):
with open(log_file, 'w') as fh:
process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
while True:
output = process.stdout.readline()
if output == '' and process.poll() is not None:
break
if output:
print output.strip()
fh.write(output)
rc = process.poll()
return rc
if __name__ == "__main__":
cmdList = ["dse", "spark-submit", "--spark-master", "spark://127.0.0.1:7077", "--class", "com.spark.myapp", "./myapp.jar"]
log_file = "/tmp/out.log"
exist_status = submitJob(cmdList, log_file)
print "job finished with status ",exist_status
奇怪的是,当我在 shell 中直接执行相同的命令时,它可以正常工作并在程序进行时在屏幕上产生输出。
所以看起来我将 subprocess.PIPE 用于标准输出和写入文件的方式有问题。
目前推荐的使用子进程模块逐行实时写入标准输出和日志文件的方法是什么?我在互联网上看到一堆选项,但不确定哪个是正确的或最新的。
谢谢
【问题讨论】:
-
您的 for 循环可能会更薄一些,否则应该这样做。我不知道 spark 或它对 stdout 的作用,但这可能是更好的地方。我认为你应该添加一个
spark标签。并且可能删除bash标签。
标签: python linux python-2.7 apache-spark subprocess