Python执行系统命令或shell脚本的常见方法

1.os.system

import os                                                 
'''                                                       
os.system(command)返回脚本的退出状态码,一个为 0 的退出码表示进程运行正常.          
'''                                                       
shell1=os.system('sh  ~/PycharmProjects/Node_W/hello.sh') 
""" Execute the command in a subshell. """                
                                                          
print(shell1)                                             
                                                          
# hello world!!                                           
# 0   

2.os.popen
在这里插入图片描述

 '''                                                                     
popen(cmd, mode="r", buffering=-1)                                      
方法popen()打开一个管道或来自命令。返回值是连接到管道的打开文件对象,可以根据模式是'r'(默认)还是'w'来读取或写入,        
Bufsize参数与open()函数中的含义相同。                                               
                                                                        
command -- 使用的命令。                                                       
mode -- 模式权限可以是 'r'(默认) 或 'w'。                                          
bufsize -- 指明了文件需要的缓冲大小:0意味着无缓冲;1意味着行缓冲;其它正值表示使用参数大小的缓冲(大概值,以字节为单位)。    
负的bufsize意味着使用系统的默认值,一般来说,对于tty设备,它是行缓冲;对于其它文件,它是全缓冲。如果没有改参数,使用系统的默认值。  
'''  
                                                                   
shell2=os.popen('sh  ~/PycharmProjects/Node_W/1.sh')                    
print(shell2)                                                           
##返回的是对象<os._wrap_close object at 0x109c50a50>                          
shell3=os.popen('ls','r',1)                                             
print(shell3)                                                           
##<os._wrap_close object at 0x100eeba50>    

3.subprocess模块 (替代了python3之前的commands,python3.x移除了)
3.1:subprocess.run()
在这里插入图片描述

import subprocess     

‘’’
子进程管理
subprocess 模块允许你生成新的进程,连接它们的输入、输出、错误管道,
并且获取它们的返回码。此模块打算代替一些老旧的模块与功能:

subprocess.run(*popenargs,input=None, capture_output=False, timeout=None, check=False, **kwargs

run() 函数是在 Python 3.5 被添加的
*popenargs:要执行的命令
timeout :参数将被传递给 Popen.communicate()。如果发生超时,子进程将被杀死并等待。 TimeoutExpired 异常将在子进程中断后被抛出。
input:参数将被传递给 Popen.communicate() 以及子进程的标准输入.
check:如果check设为True, 并且进程以非零状态码退出, 一个 CalledProcessError 异常将被抛出.
如果 shell 设为 True,,则使用 shell 执行指定的指令
‘’’

subprocess.run('pwd')                                                                          
#/Users/apple/PycharmProjects/Node_W                                                           
subprocess.run('sh  ~/PycharmProjects/Node_W/hello.sh',shell=True)                             
##hello world!!                                                                                
subprocess.run('sh  ~/PycharmProjects/Node_W/1.sh',shell=True)                                
# Processes: 312 total, 4 running, 1 stuck, 307 sleeping, 1307 threads                         
# 2019/08/14 15:02:37                                                                          
# Load Avg: 1.83, 1.71, 1.75                                                                   
# CPU usage: 16.98% user, 43.39% sys, 39.62% idle                                              
# SharedLibs: 162M resident, 51M data, 56M linkedit.                                           
# MemRegions: 49086 total, 1167M resident, 36M private, 416M shared.                           
# PhysMem: 4074M used (990M wired), 21M unused.                                                
# VM: 1383G vsize, 1297M framework vsize, 3902(0) swapins, 46623(0) swapouts.                  
# Networks: packets: 262050/133M in, 241856/80M out.                                           
# Disks: 280349/4762M read, 126284/2588M written.   

3.2:Popen构造函数

'''                                                                       
此模块的底层的进程创建与管理由 Popen 类处理。它提供了很大的灵活性,因此开发者能够处理未被便利函数覆盖的不常见用例。             
class subprocess.Popen(self, args, bufsize=-1, executable=None,           
                 stdin=None, stdout=None, stderr=None,                    
                 preexec_fn=None, close_fds=True,                         
                 shell=False, cwd=None, env=None, universal_newlines=None,
                 startupinfo=None, creationflags=0,                       
                 restore_signals=True, start_new_session=False,           
                 pass_fds=(), *, encoding=None, errors=None, text=None):  
当shell=True时,如果arg是个字符串,就使用shell来解释执行这个字符串。如果args是个列表,则第一项被视为命令,          
其余的都视为是给shell本身的参数。也就是说,等效于:                                              
subprocess.Popen(['/bin/sh', '-c', args[0], args[1], ...])                
                                                                          
'''                                                                       
import subprocess,shlex                                                   
1.使用shell=参数                                                             
print(subprocess.Popen('sh  ~/PycharmProjects/Node_W/hello.sh',shell=True)
##<subprocess.Popen object at 0x10e2e6650>                                
##hello world!!                                                           
                                                                          
2.不使用shell参数                                                             
arg=shlex.split('sh  /Users/apple/PycharmProjects/Node_W/hello.sh')       
'''                                                                       
shlex.split()可以被用于序列化复杂的命令参数,比如:                                          
>>> shlex.split('ls ps top grep pkill')                                   
['ls', 'ps', 'top', 'grep', 'pkill']                                      
'''                                                                       
print(arg)                                                                
subprocess.Popen(arg)                                                     
# ['sh', '/Users/apple/PycharmProjects/Node_W/hello.sh']                 
# hello world!!   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值