Python-subprocess-执行shell命令

发布时间 2023-09-04 17:29:07作者: 辰令

subprocess

控制输入和输出流
处理返回代码 -处理异常
参数、退出状态码、以及stdout和stderr

字符串格式的命令 以及  字符串序列 
  数据类型应为一个string 或则 一个sequence(list, tuple等等)
  可以是字符串,也可以是命令各个参数组成的序列。
   当该参数的值是一个字符串时,该命令的解释过程是与平台相关的,因此通常建议将args参数作为一个序列传递。
输出--输入状态嘛 输出内容 异常处理 
  subprocess.run(args, *, stdin=None, input=None, stdout=None, stderr=None, 
                 shell=False, timeout=None, check=False, universal_newlines=False)
	 如果shell为True,那么指定的命令将通过shell执行。如管道、文件名通配符、环境变量扩展功能
     shell=True时,要注意可能潜在的安全问题,需要确保所有空格和元字符都被适当地引用,以避免shell注入漏洞
 call        其功能类似于os.system(cmd)。
 check_call     执行成功则返回状态码,否则抛出异常  subprocess.CalledProcessError
 check_output() 如果执行状态码为0 则返回命令执行结果,否则抛出异常 subprocess.CalledProcessError
                 为check_output会阻塞程序,直到命令执行结束返回结果,为此还增加了一个timeout参数来防止超时
 这三个函数参数和subprocess.run()的函数参数含义相同。				 
	 check=True capture_output=True	
	    **check:**如果该参数设置为 True,并且进程退出状态码不是 0,则弹 出 CalledProcessError 异常
        capture_output: 设置为True,将捕获stdout和stderr,从而获执行命令后取返回的内容		 
 subprocess.run()、subprocess.call()、subprocess.check_call()和subprocess.check_output()
    都是通过对subprocess.Popen的封装来实现的高级函数
 
universal_newlines: 该参数影响的是输入与输出的数据格式,
  比如它的值默认为False,此时stdout和stderr的输出是字节序列;
  当该参数的值设置为True时,stdout和stderr的输出是字符串 


不需要标准输出流返回信息,则可以把输出禁用掉 
result = subprocess.run(['ping','-n','3','8.8.8.8'],shell=True,stdout=subprocess.DEVNULL)
result = subprocess.run('dir -L',shell= True,stdout=subprocess.PIPE,stderr=subprocess.PIPE,encoding='gbk')
   运行结果会被保存在返回对象的stdout属性中
subprocess.getoutput()和subprocess.getstatusoutput()函数是来自Python 2.x的commands模块的两个遗留函数。它们隐式的调用系统shell,
  并且不保证其他函数所具有的安全性和异常处理的一致性
 
subprocess模块底层的进程创建和管理是由Popen类来处理的
   Popen communicate  poll wait  terminate kill
   
类似df -Th | grep data命令的功能,实际上就是实现shell中管道的共功能
  >>  p1 = subprocess.Popen(['df', '-Th'], stdout=subprocess.PIPE)
  >>> p2 = subprocess.Popen(['grep', 'data'], stdin=p1.stdout, stdout=subprocess.PIPE)
  >>> out,err = p2.communicate()

工具类说明

 linux终端屏幕输出的同时输出到log日志文件(tee)(script)

    tee命令
    python main.py | tee log.txt
	python命令加上-u(unbuffered)参数后会强制其标准输出也同标准错误一样不通过缓存直接打印到屏幕

开发语言

 Go  
 rust 2010 Mozilla
 ruby

Rust

 cargo
 rustup 是一个命令行工具,它可以作为编译器的工具链。
  rustup 默认安装的组件:
     rustc — Rust 编译器。
     rust-std — Rust 标准库。
     cargo — 包管理和构建工具,类似于 Java 的 Maven 和 Gradle。
     rust-docs — Rust 文档。
     rustfmt — 用来格式化 Rust 源代码。
     clippy — Rust 的代码检查工具。
rustc – version,提示版本则说明安装成功
  Rust要有能力和Windows上的静态库和动态库来交互,因此Rust报错意味着缺少链接器(link.exe),
  遇到报错 error: linker `link.exe` not found

     rustup toolchain install  stable-x86_64-pc-windows-gnu
     rustup default stable-x86_64-pc-windows-gnu
  

rustc 指令只适合调式运行简单的文件,要调式大型或者项目文件请使用cargo指令
 cargo 是用于管理 projects、crates(rust 包)的命令行,并且是我们在处理 Rust 项目时最常使用的工具
  cargo --version
  
   rustup default stable-x86_64-pc-windows-gnu
   rustup toolchain install stable-x86_64-pc-windows-gnu 

Cargo更换镜像源

 rust项目的根目录(即目录下有Cargo.toml和src/文件),rust-analyzer插件可以识别到项目	   
  cargo new rustdemo ###cargo来创建一个项目:cargo new 文件名
  cargo build 打开src找到main.rs,先运行一下(cargo build),会自动生成下面的target和.gitignore;Cargo.lock;Cargo.toml等文件,他们都是项目的配置文件。包含了项目的创建名称,版本等
 
  cargo run	 

Vscode

开发环境配置(settings.json)