python
subprocess模块怎么使用?
一、subprocess模块怎么使用?
subprocess 模块主要用于创建子进程,并连接它们的输入、输出和错误管道,获取它们的返回状态。通俗地说就是通过这个模块,你可以在 Python 的代码里执行操作系统级别的命令,比如ipconfig、du -sh等。
subprocess 模块替代了一些老的模块和函数,比如:os.system、os.spawn*等。
subprocess 过去版本中的call(),check_call()和check_output()已经被run()方法取代了。run()方法为 3.5 版本新增。
大多数情况下,推荐使用run()方法调用子进程,执行操作系统命令。在更高级的使用场景,你还可以使用 Popen 接口。其实run()方法在底层调用的就是 Popen 接口。
subprocess.run
subprocess.run(args, *, stdin=None, input=None, stdout=None, stderr=None, shell=False, timeout=None, check=False, encoding=None, errors=None)
功能:执行 args 参数所表示的命令,等待命令结束,并返回一个 CompletedProcess 类型对象。
注意,run() 方法返回的不是我们想要的执行结果或相关信息,而是一个 CompletedProcess 类型对象。
上面参数表里展示的只是一些常用的,真实情况还有很多。
args:表示要执行的命令,必须是一个字符串,字符串参数列表。
stdin、stdout 和 stderr:子进程的标准输入、输出和错误。其值可以是subprocess.PIPE、subprocess.DEVNULL、一个已经存在的文件描述符、已经打开的文件对象或者 None。
subprocess.PIPE表示为子进程创建新的管道,subprocess.DEVNULL表示使用os.devnull。默认使用的是 None,表示什么都不做。另外,stderr 可以合并到 stdout 里一起输出。
timeout:设置命令超时时间。如果命令执行时间超时,子进程将被杀死,并弹出TimeoutExpired异常。
check:如果该参数设置为 True,并且进程退出状态码不是 0,则弹出CalledProcessError异常。
encoding:如果指定了该参数,则 stdin、stdout 和 stderr 可以接收字符串数据,并以该编码方式编码。否则只接收 bytes 类型的数据。
shell:如果该参数为 True,将通过操作系统的 shell 执行指定的命令。
看下面的例子:
>>> subprocess.run(["ls", "-l"]) # 没有对输出进行捕获 CompletedProcess(args=['ls', '-l'], returncode=0) >>> subprocess.run("exit 1", shell=True, check=True) Traceback (most recent call last): ... subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1 >>> subprocess.run(["ls", "-l", "/dev/null"], stdout=subprocess.PIPE) CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0, stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n') >>> subprocess.run("python --version", stdout=subprocess.PIPE) CompletedProcess(args='python --version', returncode=0, stdout=b'Python 3.6.1\r\n') >>>s= subprocess.run("ipconfig", stdout=subprocess.PIPE) # 捕获输出 >>>print(s.stdout.decode("GBK"))
subprocess.CompletedProcess
run() 方法的返回值,表示一个进程结束了。CompletedProcess类有下面这些属性:
args 启动进程的参数,通常是个列表或字符串。
returncode 进程结束状态返回码。0表示成功状态。
stdout 获取子进程的 stdout。通常为 bytes 类型序列,None 表示没有捕获值。如果你在调用 run() 方法时,设置了参数stderr=subprocess.STDOUT,则错误信息会和 stdout 一起输出,此时 stderr 的值是 None。
stderr 获取子进程的错误信息。通常为 bytes 类型序列,None 表示没有捕获值。
check_returncode() 用于检查返回码。如果返回状态码不为零,弹出CalledProcessError异常。
subprocess.DEVNULL
一个特殊值,用于传递给 stdout、stdin 和 stderr 参数。表示使用os.devnull作为参数值。
subprocess.PIPE
管道,可传递给 stdout、stdin 和 stderr 参数。
subprocess.STDOUT
特殊值,可传递给 stderr 参数,表示 stdout 和 stderr 合并输出。
args 与 shell
args 参数可以接收一个类似'du -sh'的字符串,也可以传递一个类似['du', '-sh']的字符串分割列表。shell 参数默认为 False,设置为 True 的时候表示使用操作系统的 shell 执行命令。
下面我们来看一下两者的组合结果。
In [14]: subprocess.run('du -sh') --------------------------------------------------------------------------- FileNotFoundError Traceback (most recent call last) ...... FileNotFoundError: [Errno 2] No such file or directory: 'du -sh' In [15]: subprocess.run('du -sh', shell=True) 175M . Out[15]: CompletedProcess(args='du -sh', returncode=0)
可见,在 Linux 环境下,当 args 是个字符串时,必须指定 shell=True。成功执行后,返回一个CompletedProcess 对象。
In [16]: subprocess.run(['du', '-sh'], shell=True) .....大量的数据 4 ./文档 179100 . Out[16]: CompletedProcess(args=['du', '-sh'], returncode=0) In [17]: subprocess.run(['du', '-sh']) 175M . Out[17]: CompletedProcess(args=['du', '-sh'], returncode=0)
可见,当args是一个['du', '-sh']列表,并且shell=True的时候,参数被忽略了,只执行不带参数的du命令。
总结:Linux 中,当 args 是个字符串是,请设置 shell=True,当 args 是个列表的时候,shell 保持默认的 False。
获取执行结果
run() 方法返回的是一个 CompletedProcess 类型对象,不能直接获取我们通常想要的结果。要获取命令执行的结果或者信息,在调用 run() 方法的时候,请指定 stdout=subprocess.PIPE。
>>> ret = subprocess.run('dir', shell=True) >>> ret CompletedProcess(args='dir', returncode=0) >>> ret = subprocess.run('dir', shell=True, stdout=subprocess.PIPE) >>> ret CompletedProcess(args='dir', returncode=0, stdout=b' \xc7\xfd\xb6\xaf\xc6\xf7 ......') >>> ret.stdout b' \xc7\xfd\xb6\xaf\xc6\xf7 C \xd6\xd0\xb5\xc4\xbe\xed\xca\xc7 ......'
从例子中我们可以看到,如果不设置stdout=subprocess.PIPE,那么在返回值CompletedProcess(args='dir', returncode=0)中不会包含 stdout 属性。反之,则会将结果以 bytes 类型保存在 ret.stdout 属性中。
交互式输入
并不是所有的操作系统命令都像‘dir’或者‘ipconfig’那样单纯地返回执行结果,还有很多像‘python’这种交互式的命令,你要输入点什么,然后它返回执行的结果。使用run()方法怎么向stdin里输入?
这样?
import subprocess ret = subprocess.run("python", stdin=subprocess.PIPE, stdout=subprocess.PIPE,shell=True) ret.stdin = "print('haha')" # 错误的用法 print(ret)
这样是不行的,ret作为一个CompletedProcess对象,根本没有stdin属性。那怎么办呢?前面说了,run()方法的stdin参数可以接收一个文件句柄。比如在一个1.txt文件中写入print('i like Python')。然后参考下面的使用方法:
import subprocess fd = open("d:\\1.txt") ret = subprocess.run("python", stdin=fd, stdout=subprocess.PIPE,shell=True) print(ret.stdout) fd.close()
这样做,虽然可以达到目的,但是很不方便,也不是以代码驱动的方式。这个时候,我们可以使用Popen类。
subprocess.Popen()
用法和参数与run()方法基本类同,但是它的返回值是一个Popen对象,而不是CompletedProcess对象。
>>> ret = subprocess.Popen("dir", shell=True) >>> type(ret) <class 'subprocess.Popen'> >>> ret <subprocess.Popen object at 0x0000000002B17668>
Popen对象的stdin、stdout和stderr是三个文件句柄,可以像文件那样进行读写操作。
>>>s = subprocess.Popen("ipconfig", stdout=subprocess.PIPE, shell=True) >>>print(s.stdout.read().decode("GBK"))
要实现前面的‘python’命令功能,可以按下面的例子操作:
import subprocess s = subprocess.Popen("python", stdout=subprocess.PIPE, stdin=subprocess.PIPE, shell=True) s.stdin.write(b"import os\n") s.stdin.write(b"print(os.environ)") s.stdin.close() out = s.stdout.read().decode("GBK") s.stdout.close() print(out)
通过s.stdin.write()可以输入数据,而s.stdout.read()则能输出数据。
二、subprocess能连接服务器吗?
是的,subprocess可以连接服务器。通过subprocess模块,Python程序可以调用操作系统的命令行工具,包括连接和通信网络服务器的工具,比如ssh、telnet或者ftp等。
使用subprocess.call或subprocess.Popen可以在Python程序中执行这些命令行工具,实现与服务器的连接和交互。
同时,subprocess还提供了丰富的参数和选项,可以很灵活地控制连接服务器的行为,实现对服务器的管理和操作。因此,subprocess是一个非常强大和灵活的工具,可以在Python中实现连接服务器的功能。
三、multiprocessing和subprocess在实质上有什么区别?
multiprocessing跟threading非常类似,主要是用来把当前任务拆分成多个子任务,并分配到多个处理器核心上去执行。
也就是说multiprocessing主要是为了通过多核处理提升任务运行效率的,让任务运行更快。subprocess是为了让你能够运行和控制其他任意程序,主要用于在Python中与外部程序交互。比如subproces执行系统调用,再获取系统调用的标准输出流和错误流等。四、python?
Python是一种跨平台的计算机程序设计语言。 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的、大型项目的开发。
它还有一个很惊人的中文名,叫蟒蛇。
五、python和python的区别?
python和python这2个是一样的,并没有区别。
很显然,两个一样的物品或者内容并不存在不同,提问的第一个元素与第二个元素是一模一样,本质上讲就是一个东西、一件事情。
建议把前后两个要做对比的元素描述清楚,比如python2.X和Python3.X有什么区别,才能正确结论。
六、python为什么叫python?
自从20世纪90年代初Python语言诞生至今,它已被逐渐广泛应用于系统管理任务的处理和Web编程。
Python的创始人为荷兰人吉多·范罗苏姆 [4] (Guido van Rossum)。1989年圣诞节期间,在阿姆斯特丹,Guido为了打发圣诞节的无趣,决心开发一个新的脚本解释程序,作为ABC 语言的一种继承。之所以选中Python(大蟒蛇的意思)作为该编程语言的名字,是取自英国20世纪70年代首播的电视喜剧《蒙提.派森的飞行马戏团》(Monty Python's Flying Circus)。
七、Python Python语句list(range(1?
python2.x中,range返回的是一个列表
python3.x中,range返回的是一个迭代值
类似forninrange(1,10):之类的可以照常使用
如果要在3.x中产生1-10的列表,可以list(range(1,10))~~
八、python pyw需要python环境吗?
需要。只有完成打包好的exe文件才能脱离python环境,独立运行。
九、python环境和Python编程区别?
Python 环境和 Python 编程是两个不同的概念,但它们之间存在一定的联系。
Python 环境:Python 环境通常指的是 Python 的运行环境,包括 Python 解释器和 Python 标准库。Python 解释器负责执行 Python 代码,而 Python 标准库则提供了许多常用的 Python 模块和功能。此外,Python 环境还可能包括一些第三方库和扩展,以支持特定的功能或应用。
常见的 Python 环境有:
CPython:官方版的 Python 解释器,使用 C 语言编写,支持多种操作系统。
Jython:使用 Java 编写的 Python 解释器,可以将 Python 代码转换为 Java 字节码,从而在 Java 虚拟机上运行。
IronPython:使用C#编写的Python解释器,可以在.NET框架上运行。
Python 编程:Python 编程指的是使用 Python 语言编写程序的过程。Python 是一种高级、解释型的编程语言,具有简洁明了的语法和强大的功能,广泛应用于网络开发、数据分析、人工智能等领域。
Python 编程的特点包括:
语法简洁:Python 的语法简洁明了,易于阅读和编写。
跨平台:Python 支持多种操作系统,如 Windows、Linux 和 macOS 等。
丰富的库和框架:Python 拥有丰富的第三方库和框架,可以快速实现各种功能和应用。
强大的社区支持:Python 拥有庞大的开发者社区,提供大量的教程、资源和技术支持。
综上所述,Python 环境是 Python 编程的运行环境,包括 Python 解释器和相关库;而 Python 编程则是使用 Python 语言编写程序的过程。两者之间存在联系,但概念上不同。
十、python作用?
最接近生活的就是实现办公自动化
热点信息
-
在Python中,要查看函数的用法,可以使用以下方法: 1. 使用内置函数help():在Python交互式环境中,可以直接输入help(函数名)来获取函数的帮助文档。例如,...
-
一、java 连接数据库 在当今信息时代,Java 是一种广泛应用的编程语言,尤其在与数据库进行交互的过程中发挥着重要作用。无论是在企业级应用开发还是...
-
一、idea连接mysql数据库 php connect_error) { die("连接失败: " . $conn->connect_error);}echo "成功连接到MySQL数据库!";// 关闭连接$conn->close();?> 二、idea连接mysql数据库连...
-
要在Python中安装modbus-tk库,您可以按照以下步骤进行操作: 1. 确保您已经安装了Python解释器。您可以从Python官方网站(https://www.python.org)下载和安装最新版本...