Python执行外部命令的方法

发布时间:2020-08-06 13:57:52 作者:小新
来源:亿速云 阅读:178

这篇文章给大家分享的是有关Python执行外部命令的方法的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。

调用shell命令

#!/usr/bin/python3

import subprocess

# 执行外部命令 'date'
subprocess.call('date')

# 传递选项和参数给命令
print("\nToday is ", end="", flush=True)
subprocess.call(['date', '-u', '+%A'])

# 其他例子
print("\nSearching for 'hello world'", flush=True)
subprocess.call(['grep', '-i', 'hello world', 'hello_world.py'])

这里的import语句用于载入subprocess模块,它是Python标准库的一部分

subprocess模块中的call函数是一种执行外部命令的方式

通过传递True给flush参数(默认是False),我们确保这个信息在subprocess.call运行之前输出

想要给命令传递参数,需要使用字符串列表

$ ./calling_shell_commands.py
Tue Jun 21 18:35:33 IST 2016

Today is Tuesday

Searching for 'hello world'
print("Hello World")

使用扩展调用shell命令

#!/usr/bin/python3

import subprocess

# 不使用扩展调用Shell命令
print("No shell expansion when shell=False", flush=True)
subprocess.call(['echo', 'Hello $USER'])

# 使用Shell扩展调用Shell命令
print("\nshell expansion when shell=True", flush=True)
subprocess.call('echo Hello $USER', shell=True)

# 如果引号是命令的一部分则进行反义
print("\nSearching for 'hello world'", flush=True)
subprocess.call('grep -i \'hello world\' hello_world.py', shell=True)

默认subprocess.call不会扩展shell 通配符,使用 command替换等等

可以设定shell参数为True进行重写

注意现在整个命令行都作为一个字符串而不是字符串列表

命令中含有引号如要转义

仅在你确定命令会正确执行的情况下使用shell=True,否则会存在安全问题

$ ./shell_expansion.py
No shell expansion when shell=False
Hello $USER

shell expansion when shell=True
Hello learnbyexample

Searching for 'hello world'
print("Hello World")

在特定情况下,我们可以使用单/双引号的组合来避免使用转义符号

# 像这样使用另一种引号
subprocess.call('grep -i "hello world" hello_world.py', shell=True)

# 或者这样
subprocess.call("grep -i 'hello world' hello_world.py", shell=True)

Shell命令重定向可以正常使用

# 为了避免call函数字符串太常,我们使用变量先存储命令
cmd = "grep -h 'test' report.log test_list.txt > grep_test.txt"
subprocess.call(cmd, shell=True)

避开使用shell=True

>>> import subprocess, os
>>> subprocess.call(['echo', 'Hello', os.environ.get("USER")])
Hello learnbyexample
0

os.environ.get("USER")返回环境变量USER的值

0退出状态码,意味着成功执行了命令。

获取命令输出和重定向

#!/usr/bin/python3

import subprocess

# 输出也包含任何的错误信息
print("Getting output of 'pwd' command", flush=True)
curr_working_dir = subprocess.getoutput('pwd')
print(curr_working_dir)

# 获取命令执行的状态和输出
# 退出状态码不是“0”意味着有什么事情出错了
ls_command = 'ls hello_world.py xyz.py'
print("\nCalling command '{}'".format(ls_command), flush=True)
(ls_status, ls_output) = subprocess.getstatusoutput(ls_command)
print("status: {}\noutput: '{}'".format(ls_status, ls_output))

# 抑制出错信息
# subprocess.call()返回命令的状态码 returns status of command which can be used instead
print("\nCalling command with error msg suppressed", flush=True)
ls_status = subprocess.call(ls_command, shell=True, stderr=subprocess.DEVNULL)
print("status: {}".format(ls_status))

getstatusoutput()的输出是元组数据类型,更多信息和例子在后续章节

getstatusoutput()和getoutput()老式的函数

使用有更多特性和安全选项的新函数

$ ./shell_command_output_redirections.py
Getting output of 'pwd' command
/home/learnbyexample/Python/python_programs

Calling command 'ls hello_world.py xyz.py'
status: 2
output: 'ls: cannot access xyz.py: No such file or directory
hello_world.py'

Calling command with error msg suppressed
hello_world.py
status: 2

感谢各位的阅读!关于Python执行外部命令的方法就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到吧!

推荐阅读:
  1. C# 执行外部命令的代码
  2. 解决anaconda中执行pip命令显示不是内部或外部命令的方法

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

python

上一篇:8080端口被占用怎么办

下一篇:bootstrap-进度条--动态条纹进度条

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》