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!!