Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >使出Python的六脉神剑,让Python拥有无限扩展性

使出Python的六脉神剑,让Python拥有无限扩展性

作者头像
蒙娜丽宁
发布于 2020-11-05 07:15:02
发布于 2020-11-05 07:15:02
72500
代码可运行
举报
文章被收录于专栏:极客起源极客起源
运行总次数:0
代码可运行

为了让更多的人看到本文,请各位读者动动小手,点击右上角【...】,将本文分享到朋友圈,thanks!

我们知道,PythonAPI非常多,功能非常强大,而且非常易用。Python之所以强大,一个重要原因是因为Python非常容易与其他编程语言交互。这就让Python拥有了无限扩展性。就算Python无法实现某个功能,可以用其他语言实现,然后Python直接调用即可。

Python与其他编程语言交互,主要有如下两种方法:

(1)调用动态库,如.dll,.so等;

(2)直接执行外部命令,并接收外部命令的返回结果;

第1种方法我会在后面的文章中详细讨论,本文主要讲解如何使用Python执行外部的命令,并传递参数和接收返回值,然后做更进一步的处理。本文将介绍6种执行外部命令的方法,并比较这6中方法的优缺点。史称这6种执行外部命令的方法为六脉神剑。

Python执行外部命令的6种方法:

1. system函数

基本的调用格式如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import os
os.system("some_command with args");

system函数会将命令和参数传递给系统的Shell。这么做非常好,因为您实际上可以用这种方式一次运行多个命令,并设置管道和输入/输出重定向。例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import os
os.system("cat command.py | grep -n subprocess > result.txt")

执行这段代码,会在当前目录生成一个result.txt文件。

尽管这样做很方便,但必须手动处理转义字符(例如空格等)。所以这样做只是让你简单地运行Shell程序,而不是扩展程序的功能。

2. popen函数

基本调用格式如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import os
stream = os.popen("some_command with args")

popen函数与os.system函数的功能相同,只是popen函数提供了一个用于操作文件的对象,可用使用标准输入输出的方式来访问文件中的数据。popen函数还有其他3种变体,它们对I/O的处理略有不同。如果将所有内容都作为字符串传递,那么命令将传递到Shell程序;如果将它们作为列表传递,则无需担心转义任何内容。例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import os
stream = os.popen("cat command.py | grep -n subprocess")
print(type(stream))
result = stream.readlines()
print(type(result))
print(result)

执行这段代码,会输出如下内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<class 'os._wrap_close'>
<class 'list'>
['1:import subprocess\n', '2:subprocess.run(["ls", "-l"])\n', '5:subprocess.call(["ls", "-l"])\n', '8:os.system("cat command.py | grep -n subprocess > result.txt")\n']

我们可以看到,readlines方法以列表形式返回命令的执行结果。

3. Popen类

subprocess模块的Popen类。该类可用于替换os.popen函数。但Popen类的缺点是由于功能过于强大,所以使用起来稍微复杂一些。例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print(subprocess.Popen("echo Hello World", shell=True, stdout=subprocess.PIPE).stdout.read())

这行代码可以用来替换下面的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print(os.popen("echo Hello World").read())

关于Popen类的一个更复杂的例子如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import subprocess
p = subprocess.Popen('ls', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
for line in p.stdout.readlines():
    print(line.decode("utf-8").strip())
retval = p.wait()

这段代码通过标准输出的readlines方法读取了ls命令返回结果的所有行,并将这些内容输出到Console。最后用wait方法等待ls命令执行完,最后结束程序。

Popen类相对于popen函数的优势是将所有的选项都统一放在了Popen类中,而不是需要4个不同的popen函数完成这些工作。

4.call函数

来自subprocess模块的call函数。与Popen类一样,拥有相同的参数,但call函数只会等待命令执行完并提供返回代码才结束。例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
return_code = subprocess.call("echo Hello World", shell=True)
print(return_code)

5. run函数

如果读者使用的是Python 3.5或更高版本,则可以使用新的subprocess.run函数,该函数与上面的代码非常相似,但是更加灵活,并在命令完成执行后返回CompletedProcess对象。例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import subprocess
result = subprocess.run(["ls", "-l"])
print(type(result))

6. 类C函数

os模块还提供了与C语言类似的fork / exec / spawn函数,但是我不建议直接使用它们,例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import os
print(os.execl('/bin/ls', ' '))

最后,请注意,对于这些执行外部命令的方法,需要将这些命令执行后参数的字符串传递回程序,有时需要对这些传回的字符串进行转移。如果你无法完全信任这些字符串,那么有可能会带来严重的安全隐患。例如,如果用户正在输入字符串的某些/任何部分。如果不确定,请仅将这些方法与常量一起使用。为了更好地说明这一点,请看下面的代码。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print(subprocess.Popen("echo %s " % user_input, stdout=PIPE).stdout.read())

我们可以想象,当用户输入了“I love your harddisk && rm -rf /”,这将删除硬盘中的所有数据。所以如果你对用户的输入无法完全信任的话,请将变量user_input改成常量,不让用户任意输入。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-11-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 极客起源 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Python调用系统命令的六种方法
作为胶水语言,Python可以很方便的执行系统命令,Python3中常用的执行操作系统命令有os.system()、os.popen()、subprocess.popen()、subprocess.call()、subprocess.run()、subprocess.getstatusoutput()六种方法。
吾非同
2020/12/07
4.3K0
Python调用系统命令的六种方法
Python 执行系统命令
Python 编程过程中经常会用到系统命令,本文记录实现方法。 系统命令 作为胶水语言,Python可以很方便的执行系统命令,Python3中常用的执行操作系统命令有以下方式 os.system() os.popen() subprocess 模块 os.system 执行命令但无法获取取命令输出时,可以使用 os.system os.system() 是C语言 system() 函数的封装,返回命令的退出状态码,命令执行结果输出到标准输出(stdout/窗口)。 system函数可以将
为为为什么
2022/08/10
2K0
笔记 | 如何在Python下调用Linux的Shell命令?
昨天应导师要求,需要写很多python脚本在linux下,这样就会用到如何在python下调用linux命令。
zenRRan
2018/12/17
4.9K0
【说站】Python脚本如何调用外部命令
这很好,因为实际上可以以这种方式一次运行多个命令并设置管道和输入/输出重定向。例如:
很酷的站长
2022/11/24
8800
【说站】Python脚本如何调用外部命令
python的subprocess模块
1 os与commands模块 ​ 2 subprocess模块 ​ 3 subprocess.Popen类
py3study
2020/01/07
3.3K0
python执行系统命令的方法
    做为系统工程师来说,经常会用到python脚本去调用一下系统命令,现把经常使用的集中调用方法总结如下:
py3study
2020/01/07
4K0
Python调用外部系统命令
利用Python调用外部系统命令的方法可以提高编码效率。调用外部系统命令完成后可以通过获取命令执行返回结果码、命令执行的输出结果进行进一步的处理。本文主要描述Python常见的调用外部系统命令的方法,包括os.system()、os.popen()、subprocess.Popen()等。
Python学习者
2023/07/04
5200
python调用外部命令的四种方式
python提供了几种调用shell的命令,但是每个命令的功能不同,需要详细了解下,才可以比较方便的来应对不同的需求。
陈晨135
2022/01/06
1K0
python调用外部命令的四种方式
Python实现调用并执行Linux系统命令
在Python开发过程中,我们经常需要执行一些Linux系统命令来完成特定的任务,如文件操作、系统状态检查等。
程序员洲洲
2024/06/09
5540
Python实现调用并执行Linux系统命令
python进程模块
然后还有一个os.fork函数,可以调用系统api并且创建子进程。但是fork在Windows上并不存在,在Linux和Mac可以成功使用。因为手头没有Linux的机器,就没尝试这个。
灯珑LoGin
2022/10/31
3530
Python模块之subprocess用法实例详解
subprocess最早在2.4版本引入。用来生成子进程,并可以通过管道连接他们的输入/输出/错误,以及获得他们的返回值。
菲宇
2019/06/13
26.9K0
python执行shell命令的方法
使用commands模块的getoutput方法,这种方法同popend的区别在于popen返回的是一个文件句柄,而本方法将外部程序的输出结果当作字符串返回,很多情况下用起来要更方便些。
py3study
2020/01/14
1.8K0
两天研习Python基础(五) 执行外部命令
[1]Python标准库: https://docs.python.org/3/library/index.html
王诗翔呀
2020/07/02
1K0
python 调用cmd,不显示cmd黑
       在一个子shell中运行command命令,并返回command命令执行完毕后的退出状态。这实际上是使用C标准库函数system()实现的。这个函数在执行command命令时需要重新打开一个终端,并且无法保存command命令的执行结果。
py3study
2020/01/08
4.1K0
Python Subprocess库详解
Subprocess库是Python中用于创建和管理子进程的标准库。它提供了一个强大而灵活的接口,使得你可以在Python中启动新的进程、连接它们的输入和输出,并与它们进行交互。本教程将介绍Subprocess库的基本概念、用法和一些常见的应用场景。
Michel_Rolle
2024/02/04
3.2K0
subprocess:Python中创建子进程
subprocess库提供了一个API创建子进程并与之通信。这对于运行生产或消费文本的程序尤其有好处,因为这个API支持通过新进行的标准输入和输出通道来回传数据。
luckpunk
2023/09/29
9020
subprocess:Python中创建子进程
【module】subprocess
subprocess模块是python从2.4版本开始引入的模块。主要用来取代 一些旧的模块方法,如os.system、os.spawn、os.popen、commands.*等subprocess通过子进程来执行外部指令,并通过input/output/error管道,获取子进程的执行的返回信息。
py3study
2020/01/02
2K0
Python模块学习:subprocess模块详解
subprocess是Python 2.4中新增的一个模块,它允许你生成新的进程,连接到它们的 input/output/error 管道,并获取它们的返回(状态)码。这个模块的目的在于替换几个旧的模块和方法,如:
Python学习者
2023/08/26
2.9K0
在python中运行命令行命令的四种方案
本文由腾讯云+社区自动同步,原文地址 https://stackoverflow.club/article/run_shell_command_in_python/
羽翰尘
2019/11/20
35K0
python中执行shell命令的几个方
最近有个需求就是页面上执行shell命令,第一想到的就是os.system, 代码如下:
py3study
2020/01/06
3.2K0
相关推荐
Python调用系统命令的六种方法
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验