subprocess模块是Python标准库中的一个模块,用于创建和控制子进程。它提供了一种在Python程序中调用其他外部命令、执行系统命令和与系统进程进行交互的方法。常用的有两种方法:subprocess.run(),subprocess.Popen()
subprocess.run()是subprocess模块中一个常用的函数,也是官方推荐的方法,它用于运行命令并等待其完成。
subprocess.run(args, *, stdin=None, input=None, stdout=None, stderr=None, shell=False, timeout=None, check=False, encoding=None, errors=None, text=None, cwd=None, env=None, universal_newlines=None)
常用参数说明:
import subprocess
subprocess.run(['ls', '-l'])
import subprocess
subprocess.run('echo Hello, World!', shell=True)
import subprocess
subprocess.run(['grep', 'hello'], input=b'Hello, world!\nHello, Python!')
打印结果:
![](http://rxfj6v915.hn-bkt.clouddn.com/FjLlvbwamnPX_cS27QZph2vSQ7aM)
import subprocess
try:
subprocess.run(['sleep', '10'], timeout=5)
except subprocess.TimeoutExpired:
print("Timeout reached")
import subprocess
subprocess.run(['ls', '-l'], cwd='/opt/')
import subprocess
subprocess.run(['ls','huaei'], cwd='/opt/', check=True)
# 使用管道捕获输出
a = subprocess.run('ls /opt/huawei', shell=True, stdout=subprocess.PIPE)
subprocess.Popen()是subprocess模块中用于创建子进程的函数之一。它提供了更灵活的控制和处理子进程的能力。
subprocess.Popen(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=False, startupinfo=None, creationflags=0, restore_signals=True, start_new_session=False, pass_fds=(), *, encoding=None, errors=None)
常用参数说明:
import subprocess
process = subprocess.Popen(['ls', '-l'], stdout=subprocess.PIPE)
output, error = process.communicate()
print(output.decode())
process = subprocess.Popen(['grep', 'hello'], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
# communicate:参数是标准输入,返回标准输出和标准出错
output, error = process.communicate(input=b'hello, world!')
print(output)
subprocess.Popen(['sleep', '10'])
subprocess.Popen('echo Hello, World!', shell=True)
subprocess.Popen(['ls', '-l'], cwd='/path/to/directory', env={'VAR': 'value'})
poll(): 该方法用于检查子进程是否已经结束,并返回子进程的返回码。如果子进程尚未结束,poll()
会立即返回None;如果子进程已经结束,poll()
会返回子进程的返回码。这个方法通常在你需要非阻塞地检查子进程状态时使用。
import subprocess
# 启动一个子进程
process = subprocess.Popen(['echo', 'Hello, world!'], stdout=subprocess.PIPE)
# 检查子进程是否结束
return_code = process.poll()
if return_code is None:
print("子进程尚未结束")
else:
print(f"子进程已结束,返回码: {return_code}")
wait(): 该方法用于等待子进程的结束,并返回子进程的返回码。如果子进程尚未结束,wait()
方法会阻塞当前进程直到子进程结束。这个方法通常在你需要等待子进程执行完毕并获取其返回码时使用。
import subprocess
# 启动一个子进程
process = subprocess.Popen(['sleep', '5'])
# 等待子进程结束并获取返回码
return_code = process.wait()
print(f"子进程已结束,返回码: {return_code}")