Python中执行外部命令

   有很多需求需要在Python中执行shell命令、启动子进程,并捕获命令的输出和退出状态码,类似于Java中的Runtime类库。

subprocess模块的使用:#

  Python使用最广泛的是标准库的subprocess模块,用来替换os.system(),os.spawn*(),os.popen*()和commands.*等模块与函数。

使用subprocess最简单的方式就是用它提供的便利函数,call,check_all与check_output,当便利函数满足不了要求再使用Popen类。

1. call #

subprocess(args,*,stdin=None,stout=None,stderr=None,shell=False)

shell=True,Python会先运行一个shell,再用shell解释字符串,而不是传递一个列表。

2. check_call#

   check_all与call类似,只是遇到异常情况返回的形式不同,它会抛出subprocess.CalledProcessError异常

3. check_output#

   这个便利函数是使用最多了,它可以获取命令的结果,而不是退出状态码

如果想要捕捉退出状态码,可以通过抛出的subprocess.CalledProcessError异常

1
2
3
4
5
6
7
import subprocess
try:
    output = subprocess.check_output('ls /zz',shell=True)
except subprocess.CalledProcessError as e:
    output = e.output
    code = e.returncode
    print (code,output)

 执行结果:

如果想捕获命令的错误输出,需将错误输出重定向到标准输出

subprocess.check_output(['cmd','arg1','arg2'],stderr=subprocess.STDOUT)

 

4. 使用Popen#

下面的exexute_cmd函数对Popen,进行了封装,执行成功,返回标准输出和状态码,失败是返回状态码和错误输出。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/usr/bin/python
#coding=utf8
import subprocess
 
def execute_cmd(cmd):
        p = subprocess.Popen(cmd,
                             shell=True,
                             stdin=subprocess.PIPE,
                             stdout=subprocess.PIPE,
                             stderr=subprocess.PIPE)
        stdout, stderr = p.communicate()
        if p.returncode != 0:
               return p.returncode, stderr
        return p.returncode, stdout
 
if __name__=='__main__':
    cmd='ls /u01'
    returncode,out=execute_cmd(cmd)
    if returncode != 0:
        raise SystemExit('execute {0} err :{1}'.format(cmd,out))
    else:
       print("execute command ({0} sucessful)".format(cmd))

  

目录不存时:

 

  

 

posted @   头痛不头痛  阅读(5372)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
点击右上角即可分享
微信分享提示
主题色彩