命令行

About 2 min

命令行

os库

  • 库:import os
  • 使用命令:os.system('')
  • 缺点:每次使用一下os.system('')命令,就会弹出一个cmd窗口,然后执行完毕后关闭。如果多次使用的话,就很烦。
import os

os.system('ls')

subprocess库

  • 库:import subprocess
  • 使用命令:subprocess.run('', shell=True)
  • 特点: 解决os库的问题,cmd窗口静默后台执行,不会弹出来烦你。
  • Popen()就不用学了,基本能干的用run()都能。

PS:python之subprocess模块详解--小白博客open in new window

执行结果

import subprocess

# 命令执行的结果是直接打在shell中
'''
`shell=True`表示命令将通过shell执行(默认`shell=False`).
shell=True是关键,不然就报错
返回CompletedProcess对象: CompletedProcess(args='ls', returncode=0)
'''
subprocess.run("ls",shell=True)
import subprocess

# 命令执行的结果没有打在shell中,而是以字节的形式返回命令执行的结果
'''
stdout=subprocess.PIPE, 我们就可以获取命令执行的结果
返回进程退出状态码 returncode,0表示success,其他表示失败。
'''
ret = subprocess.run("ls",shell=True, stdout=subprocess.PIPE)
print(ret.args, ret.returncode, ret.stdout)
# ls 0 b'LICENSE\nREADME.md\nREADME2.md\nassets\nbuild\nconfigs\ndata\nenvironment.yaml\nimages\nlatent_diffusion.egg-info\nldm\nmain.py\nmodels\nnotebook_helpers.py\nrequirements.txt\nscripts\nsetup.py\nsrc\n'
# success
if ret.returncode == 0:
    print("success")
else:
    print("error")

遇错停止程序

check_output()属于老函数,作用:

  • 不用 stdout=subprocess.PIPE,直接返回字节形式的执行结果。
  • 不像默认的run(check=False)碰到错误不停下来,check_output()碰到错误会抛出CalledProcessError
  • 我们可以用subprocess.run加个check参数来代替它。
import subprocess

# 直接返回字节形式的执行结果
t = subprocess.check_output("python -V",shell=True)
print(t)
# b'Python 3.9.13\n'

# 碰到错误会抛出`CalledProcessError`
subprocess.check_output("ls -2",shell=True)
print('wrong')
import subprocess

# 抛出错误 CalledProcessError . 默认check=False
subprocess.run("ls -2",shell=True, check=True)
print('wrong')

将控制台输出写入到文件中

import subprocess
subprocess.run('python tmp_py.py >> tmp_log.log', shell=True)
import subprocess

ret = subprocess.run("ls",shell=True,stdout=subprocess.PIPE)
with open('tmp_log.log', 'wb') as f:
    f.write(ret.stdout)