Python 从 subprocess popen 运行的子进程中实时获取输出(shell 在 python 中执行)
有时候需要把 shell 命令在 python 中执行,如果使用的方式的话,标准输出只会打印在屏幕上,没办法赋给变量,这时候就可以用subprocess来实现。
·
需求
有时候需要把 shell 命令在 python 中执行,如果使用 os.system(cmd)
的方式的话,标准输出只会打印在屏幕上,没办法赋给变量,这时候就可以用 subprocess
来实现
实现
1. os.system(cmd)
In [60]: path = "/hdfs_path/.../"
In [61]: cmd = ' /opt/tiger/.../bin/hadoop fs -du -s -h {} '.format(path)
...: res = os.system(cmd)
...:
# 如下,输出只是打印在屏幕上,没办法用变量存起来
0 0 /hdfs_path/.../
In [62]: res # 为 0 仅表示命令运行成功,与命令的标准输出无关
Out[62]: 0
2. subprocess
def du_hdfs_file(path):
from subprocess import PIPE, Popen
def cmdline(command):
"""获取标准输出"""
process = Popen(
args=command,
stdout=PIPE,
shell=True
)
return process.communicate()[0]
cmd = ' /opt/tiger/.../bin/hadoop fs -du -s -h {} '.format(path)
# res = os.system(cmd)
res = cmdline(cmd)
return res
######################################
In [65]: res = du_hdfs_file(path) # 标准输出赋值给 res
In [66]: res
Out[66]: '0 0 /hdfs_path/.../\n'
In [67]: res[0]
Out[67]: '0'
3. os.popen(cmd).read() 【推荐】
除了第2种方法,还有更简单的方法,即 os.popen(cmd).read()
import os
cmd = "hadoop fs -du -h /hdfs/path1/20221122"
res = os.popen(cmd).read()
In [219]: res
Out[219]: '22.1 G 66.2 G /hdfs/path1/20221122\n'
注意:这里有个坑,如果重复使用 read()
/ readlines()
的话,会变成空。所以应该 read()
一次,后面直接取用即可
########### 错误用法 ###########
res = os.popen("pwd")
# 第一次read正常
res.read()
Out[547]: '/home/dir1\n'
# 第二次read就变成空
res.read()
Out[548]: ''
########### 正确用法 ###########
# 最开始 read 一次即可
res = os.popen("pwd").read()
res
Out[549]: '/home/dir1\n'
res
Out[550]: '/home/dir1\n'
参考
更多推荐
已为社区贡献3条内容
所有评论(0)