python Python执行shell命令并获取结果(os.system,os.popen,subprocess)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python Python执行shell命令并获取结果(os.system,os.popen,subprocess)相关的知识,希望对你有一定的参考价值。

# 详见: <<Python Cookbook>>第三版 13.6小节

# 定义shell命令
partition_sql = """hive -e "use dim;show partitions """+table_name+""";"|tail -1|awk -F'[= /]' '{print $2}'"""
# 执行shell命令并获取结果
output = os.popen(partition_sql).read().strip().split("\n")
# 取结果第一行
dim_new_date = output[0]

# 如果不需要获取输出, 只需要获取返回值, 用os.system()即可.
os.system("echo 使用os.system执行一条shell命令")

========================

参考链接: https://docs.python.org/2/library/subprocess.html#subprocess-replacements

通常, 使用subprocess模块来替换掉更老的os.system()模块
在python3的时候, os.popen底层已经使用subprocess.Popen实现, 所以无需再进行替换了.

status = os.system("mycmd" + " myarg")
# becomes
status = subprocess.call("mycmd" + " myarg", shell=True)

此外, 除了os.popen, 还有os.popen2, os.popen3:
  - os.popen只有stdout一个输出.
  - os.popen2有stdin, stdout
  - os.popen3有stdin, stdout, stderr.
  
详见参考链接.

# 这里补充一点安全性问题:
# 使用shell=True是一个intermediate shell, 也就是先起一个shell, 然后从其运行任何指令,
# 这会暴露严重的安全问题(shell注入问题)
# 详见链接(https://stackoverflow.com/questions/3172470/actual-meaning-of-shell-true-in-subprocess)
>>> from subprocess import call
>>> filename = input("What file would you like to display?\n")
What file would you like to display?
non_existent; rm -rf / # THIS WILL DELETE EVERYTHING IN ROOT PARTITION!!!
>>> call("cat " + filename, shell=True) # Uh-oh. This will end badly...
# 如果不是shell=True, 那么除了第一个字符串, 后面的都会被识别成参数, 比较安全.
# 回想: docker的entrypoint和cmd的关系也是类似的.

以上是关于python Python执行shell命令并获取结果(os.system,os.popen,subprocess)的主要内容,如果未能解决你的问题,请参考以下文章

python执行外部命令并获取输出

python获取执行命令的返回结果

python执行shell命令?

python脚本实现本地或远程执行命令

python 调用系统命令 获取结束状态

Python执行 shell 命令并实时打印输出