Python-subprocess模块详解 (python怎样打开)
/target=_blankclass=infotextkey>Python的subprocess模块是一个十分弱小的工具,用于启动和与外部进程启动交互。它准许口头外部命令、访问系统Shell、管道数据、捕捉输入和失误消息,以及更多。
本文具体引见subprocess模块的各个方面,包括如何口头外部命令、传递参数、处置输入输入、失误处置以及一些初级运行。
1.引见
subprocess模块是Python的规范库中的一局部,它准许与外部进程启动交互。这关于口头系统命令、调用其余可口头文件、处置数据流以及与其余进程通讯十分有用。无论是须要口头便捷的命令还是须要与复杂的外部程序启动交互,subprocess都可以胜任。
在接上去的内容中,咱们将学习如何经常使用subprocess模块来口头外部命令、处置输入输入、捕捉失误消息,并讨论一些初级用法。咱们还会讨论一些安保性方面的留意事项,以确保您的程序不遭到潜在的安保破绽的要挟。
2.口头外部命令
2.1经常使用subprocess.run()
subprocess.run()是Python3.5及更高版本引入的函数,用于运转外部命令并期待其成功。
以下是一个便捷的示例,展示如何经常使用subprocess.run()来口头ls命令并失掉其输入:
importsubprocessresult=subprocess.run(["ls","-l"],stdout=subprocess.PIPE,text=True)print(result.stdout)
在下面的示例中,subprocess.run()接受一个蕴含命令及其参数的列表,经过stdout=subprocess.PIPE参数捕捉规范输入,并经常使用text=True参数指定输入为文本。最后,咱们打印了result.stdout以失掉ls-l命令的输入。
2.2经常使用subprocess.Popen()
subprocess.Popen()提供了更多的灵敏性,准许与进程启动交互,而不只仅是期待它成功。
以下是一个经常使用subprocess.Popen()的示例,展示如何口头外部命令并失掉其输入:
importsubprocess#口头命令process=subprocess.Popen(["ls","-l"],stdout=subprocess.PIPE,stderr=subprocess.PIPE,text=True)#读取规范输入和失误out,err=process.communicate()print("规范输入:")print(out)print("规范失误:")print(err)
在下面的示例中,首先经常使用subprocess.Popen()来启动进程,并指定stdout=subprocess.PIPE和stderr=subprocess.PIPE以捕捉规范输入和规范失误。而后,经常使用process.communicate()方法来期待进程成功并失掉其输入。
2.3指定口头门路
经常使用cwd参数来指定口头外部命令的上班目录。例如,要在特定目录中口头命令,可以这样做:
importsubprocessresult=subprocess.run(["ls","-l"],stdout=subprocess.PIPE,text=True,)print(result.stdout)
这将在/path/to/directory目录中口头ls-l命令。
2.4传递参数
假设命令须要接受参数,可以将它们作为列表的一局部传递给subprocess.run()或subprocess.Popen()。
例如,要将文件名作为参数传递给命令,可以这样做:
importsubprocessfilename="example.txt"result=subprocess.run(["cat",filename],stdout=subprocess.PIPE,text=True)print(result.stdout)
这将口头catexample.txt命令,其中filename是文件名。
3.处置输入输入
3.1规范输入
subprocess模块还可以将数据传递给外部命令的规范输入。要成功这一点,可以经常使用stdin参数,并将其设置为一个文件对象或一个字节串。
importsubprocessinput_data="Hello,subprocess!"result=subprocess.run(["grep","subprocess"],input=input_data,stdout=subprocess.PIPE,text=True)print(result.stdout)
在下面的示例中,经常使用input_data将数据传递给grep命令的规范输入,并搜查蕴含"subprocess"的行。
3.2规范输入
前面的示例中,曾经看到如何捕捉外部命令的规范输入。经过经常使用stdout参数,可以将规范输入重定向到文件、字节串或文件对象。
importsubprocessoutput_file=open("output.txt","w")result=subprocess.run(["ls","-l"],stdout=output_file,text=True)output_file.close()
在下面的示例中,咱们将ls-l命令的规范输入重定向到一个名为output.txt的文件。
3.3规范失误
与规范输入相似,subprocess还可以捕捉规范失误消息。要捕捉规范失误,请经常使用stderr参数。
importsubprocessresult=subprocess.run(["ls","/nonexistent"],stdout=subprocess.PIPE,stderr=subprocess.PIPE,text=True)print("规范输入:")print(result.stdout)print("规范失误:")print(result.stderr)
在下面的示例中,口头ls/nonexistent命令,该命令会发生一个失误,并将规范输入和规范失误消息捕捉到result.stdout和result.stderr中。
4.失误处置
口头外部命令时,通常须要处置失误。以下是一些处置失误的罕用方法:
4.1审核前往码
subprocess.run()和subprocess.Popen()前往一个CompletedProcess或Popen对象,其中蕴含无关命令口头的消息,包括前往码。前往码为0示意命令成功口头,非零前往码示意出现失误。
importsubprocessresult=subprocess.run(["ls","/nonexistent"],stdout=subprocess.PIPE,stderr=subprocess.PIPE,text=True)ifresult.returncode!=0:print("命令口头失败。")print("规范失误:")print(result.stderr)
在下面的示例中,审核result.returncode能否为0,假设不是,就示意命令口头失败。
4.2捕捉失误输入
有时,失误消息或者不只仅蕴含在前往码中,还蕴含在规范失误输入中。可以捕捉规范失误输入并审核其中的消息。
importsubprocessresult=subprocess.run(["ls","/nonexistent"],stdout=subprocess.PIPE,stderr=subprocess.PIPE,text=True)ifresult.returncode!=0:print("命令口头失败。")print("失误消息:")print(result.stderr)
在下面的示例中,咱们捕捉规范失误输入,并在出现失误时打印它。
5.管道和重定向
subprocess还可以创立管道,将一个命令的输入衔接到另一个命令的输入。这在处置复杂的数据处置义务时十分有用。
例如,要将一个命令的输入传递给另一个命令,可以这样做:
importsubprocess#创立第一个命令的进程process1=subprocess.Popen(["ls","/path/to/directory"],stdout=subprocess.PIPE,text=True)#创立第二个命令的进程,将第一个命令的输入衔接到它的输入process2=subprocess.Popen(["grep","search_term"],stdin=process1.stdout,stdout=subprocess.PIPE,text=True)#从第二个命令的规范输入中读取结果result=process2.communicate()[0]print(result)
在下面的示例中,首先创立第一个命令的进程,而后创立第二个命令的进程,并将第一个命令的输入衔接到第二个命令的输入。
6.初级运行
6.1同时读写规范输入输入
subprocess模块同时读取和写入规范输入和输入。这关于与外部进程启动双向通讯十分有用。
以下是一个示例,展示如何经常使用subprocess启动双向通讯:
importsubprocess#创立命令进程process=subprocess.Popen(["python","-u"],stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE,text=True,universal_newlines=True)#写入数据到规范输入process.stdin.write("print('Hellofromchildprocess')n")process.stdin.flush()#读取并打印规范输入output,errors=process.communicate()print("规范输入:")print(output)#打印规范失误print("规范失误:")print(errors)
在下面的示例中,创立了一个子进程,而后向其规范输入写入Python代码,并捕捉其规范输入和规范失误。
6.2超时处置
subprocess还准许您设置口头命令的超时期间,以防止命令运转期间过长。要成功这一点,您可以经常使用timeout参数。
例如:
importsubprocesstry:result=subprocess.run(["sleep","10"],timeout=5,stdout=subprocess.PIPE,text=True)print(result.stdout)exceptsubprocess.TimeoutExpired:print("命令口头超时。")
在下面的示例中,试图运转sleep10命令,但因为设置了5秒的超时期间,当命令运转期间超越5秒时,将引发subprocess.TimeoutExpired意外。
6.3经常使用Shell命令
自动状况下,subprocess不会经常使用Shell来口头命令。这是出于安保思考,以防止潜在的Shell注入攻打。但有些状况下,或者须要经常使用Shell来口头命令,可以将shell参数设置为True。
importsubprocess#经常使用Shell口头命令result=subprocess.run("ls-l|grep.txt",shell=True,stdout=subprocess.PIPE,text=True)print(result.stdout)
在下面的示例中,咱们经常使用Shell来口头ls-l|grep.txt命令。
7.安保性留意事项
在口头外部命令时,请务必小心处置输入,以防止潜在的安保破绽。防止将不受信赖的数据传递给subprocess,免得遭到命令注入攻打。
确保了解正在口头的命令及其参数,以防止潜在的危险。
总结
Python的subprocess模块提供了弱小的工具,准许与外部进程启动交互。可以经常使用它口头外部命令、传递参数、处置输入输入和失误消息,以及支持管道和重定向。这为编写须要与外部程序启动通讯的Python运行程序提供了关键的性能。
subprocess模块是Python中处置外部进程交互的关键工具,但在经常使用时须要留意安保性疑问,特意是在处置不受信赖的输入时。熟练把握这一模块,将有助于编写更弱小和安保的Python运行程序,能够与外部程序启动有效通讯。
python有哪些模块 Python常用模块大全?
Python有很多常用的模块,以下是一些常用模块的大致分类:1. 常用模块: - math:数学运算模块 - random:随机数生成模块 - datetime:日期和时间处理模块 - os:操作系统接口模块 - io:输入输出模块 - sys:系统相关模块 - json:JSON编码和解码模块- re:正则表达式模块- time:时间模块 - subprocess:子进程管理模块 2. 数据分析和科学计算模块: - numpy:数值计算模块- pandas:数据分析模块 - matplotlib:数据可视化模块 - scipy:科学计算模块 - scikit-learn:机器学习模块 3. 网络和Web开发相关模块: - requests:网络请求模块 - urllib:URL处理模块 - socket:网络通信模块- flask:轻量级Web开发框架- django:全功能Web开发框架 4. 数据库相关模块: - sqlite3:SQLite数据库模块 - MySQLdb:MySQL数据库模块 - psycopg2:PostgreSQL数据库模块 - pymongo:MongoDB数据库模块5. GUI开发模块:- tkinter:Python自带的图形界面模块 - PyQt:跨平台的图形界面模块 - wxPython:基于wxWidgets的图形界面模块
python中,通过命令行方式执行命令,如何才能得到返回的错误信息?
刚查了Python的文档说,要用更强大的命令行工具,最好使用subprocess。所以也许你应该好好看看subprocess模块:。这里面有很多函数,包括popen,当然是subprocess下面的。
另外,这里有个和你类似的问题:,你可以去看下,摘抄其使用subprocess的程序如下:
免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。