Python执行外部命令的方法-创新互联
创新互联www.cdcxhl.cn八线动态BGP香港云服务器提供商,新人活动买多久送多久,划算不套路!
成都创新互联公司主营洪泽网站建设的网络公司,主营网站建设方案,重庆App定制开发,洪泽h5小程序开发搭建,洪泽网站营销推广欢迎洪泽等地区企业咨询这篇文章给大家分享的是有关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执行外部命令的方法就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到吧!
本文标题:Python执行外部命令的方法-创新互联
标题URL:http://azwzsj.com/article/cdoseo.html