*本站广告为第三方投放,如发生纠纷,请向本站索取第三方联系方式沟通
创想鸟 首页好文分享
python怎么执行系统命令_python执行系统命令方法汇总
程序猿
•
2025年12月14日 11:20:36
•
好文分享 •
阅读 0
执行系统命令首选subprocess模块,因其功能全面、安全性高且支持精细控制;os.system()和os.popen()虽简单但功能有限,易引发安全风险,适用于简单场景;使用时需避免shell注入、注意编码和资源管理。
Python执行系统命令,在我看来,主要有那么几板斧:最直接的
,能获取输出的
,以及现代Python里几乎是万金油的
模块。要说哪种最好,那肯定首推
,它功能最全,控制力最强,也最符合当下编程的最佳实践。
解决方案
当我们需要在Python程序里调用外部命令时,选择哪种方式,其实是功能需求和便捷性之间的一个权衡。
1.
:最简单粗暴的选择这个函数就是直接把你的字符串命令扔给
2.
os.popen(command, mode='r', buffering=-1)
:需要获取输出时的旧方案如果你不仅想执行命令,还想拿到命令的输出内容,
就能派上用场。它会返回一个文件对象,你可以像读文件一样去读取命令的标准输出。
import os# 获取命令输出with os.popen("df -h") as f: output = f.read() print("磁盘使用情况:") print(output)# 也可以写入,但通常不这么用# with os.popen("grep python", mode='w') as f:# f.write("python is greatn")# f.write("java is also greatn")
3.
模块:现代Python的王道这才是真正值得深入研究和广泛使用的模块。它提供了极高的灵活性,可以处理标准输入、输出、错误流,控制进程的生命周期,甚至是非阻塞地执行命令。
模块里有几个常用的函数:
CompletedProcess` 对象,包含了退出码、标准输出和标准错误。
import subprocess# 简单执行并捕获输出result = subprocess.run(["ls", "-l", "/tmp"], capture_output=True, text=True)print("命令输出:")print(result.stdout)print("命令错误输出:")print(result.stderr)print(f"退出码: {result.returncode}")# 捕获输出并检查错误 (check=True 会在非零退出码时抛出 CalledProcessError)try: result_checked = subprocess.run( ["cat", "/non_existent_file"], capture_output=True, text=True, check=True ) print(result_checked.stdout)except subprocess.CalledProcessError as e: print(f"命令执行失败: {e.returncode}") print(f"错误信息: {e.stderr}")# 通过 shell=True 执行,但要小心安全问题# result_shell = subprocess.run("echo $PATH", shell=True, capture_output=True, text=True)# print(f"PATH: {result_shell.stdout}")
os.system()`,返回退出状态码,但提供了更多控制选项。
subprocess.call()
CalledProcessError` 异常。
CalledProcessError`。
subprocess
模块中最底层的接口,提供了对子进程的完全控制。你可以用它来启动一个子进程,然后通过
communicate()` 方法与它交互,或者等待它完成。这在需要更复杂交互(比如管道、异步执行)的场景下非常有用。
import subprocess# 启动一个进程,但不立即等待其完成process = subprocess.Popen(["ping", "-c", "4", "google.com"], stdout=subprocess.PIPE, text=True)# 可以做其他事情...print("后台pinging中...")# 等待进程完成并获取输出stdout, stderr = process.communicate()print("Ping结果:")print(stdout)print(f"退出码: {process.returncode}")
os.system() 和 os.popen() 的使用场景与局限性是什么?
说实话,现在在新的Python项目里,我很少会主动去用
或
了,除非是那种特别简单、对错误处理和输出解析要求不高的场景,或者为了兼容一些老旧代码。
的优点是极其简洁,一行代码就能搞定。比如,你只是想触发一个外部脚本运行,根本不关心它的输出,也不需要复杂的错误判断,只要知道它有没有“崩”就行。这时候,
os.system("my_script.sh")
确实是最快的。但它的局限性也很明显:它无法直接捕获命令的标准输出或标准错误,你只能通过返回值判断命令是否成功。如果命令执行失败,你拿不到具体的错误信息,这对于排查问题来说就很头疼。另外,它会阻塞当前进程,如果外部命令执行时间很长,你的Python程序就会一直卡在那里。
呢,比
稍微好一点,因为它能让你读取命令的输出。这在一些需要获取外部命令结果的场景下还算实用。比如,你想快速获取一个
或
命令的结果并做个简单的打印。但它的问题在于,它也只能读取标准输出,对标准错误流的处理就比较麻烦了。你很难区分哪部分是正常输出,哪部分是错误信息。而且,它同样是阻塞的,并且在错误处理方面依然不如
那么精细。更重要的是,它返回的文件对象需要手动关闭,虽然
语句能帮忙,但总体上还是不如
模块提供的
对象那样封装得好,功能也更单一。在我看来,这两个老伙计在功能上已经显得有些“力不从心”了。
为什么说 subprocess 模块是执行系统命令的最佳实践?
我觉得
模块之所以能成为现代Python里执行系统命令的最佳实践,核心就在于它的强大、灵活和安全性。它不仅仅是执行命令,更像是提供了一个完整的“子进程管理中心”。
返回的
对象,直接把
、
和
都打包好了,一目了然。
其次,精细的错误处理 是
的另一大优势。通过
参数,你可以让Python在子进程返回非零退出码时自动抛出
异常,这样你就可以用标准的
结构来优雅地处理命令执行失败的情况,而不是仅仅拿到一个退出码然后自己去判断。这让程序的健壮性大大提高。
再者,安全性和灵活性 也值得一提。当
(这也是默认值)时,
会直接执行你传入的命令列表,而不是通过shell。这意味着它不会对你的命令进行shell解析,从而有效避免了“shell注入”的安全风险。如果你确实需要shell的特性(比如管道
、重定向
等),你可以明确设置
,但这时候你就需要确保你传入的命令字符串是安全的,或者至少是来自可信源的。此外,
提供了更底层的控制,你可以启动一个非阻塞的子进程,在后台运行它,同时你的Python程序可以继续做其他事情,这对于需要并发执行多个外部任务的场景非常有用。
总的来说,
模块的设计哲学就是“给你更多的控制权,让你能更安全、更灵活地与外部世界交互”。它解决了老旧方法在功能、安全和易用性上的诸多痛点,所以,只要不是那种“一锤子买卖”的简单执行,我都会毫不犹豫地选择
。
在 Python 中执行系统命令时,有哪些常见的陷阱和安全考量?
在Python里执行系统命令,虽然方便,但确实有一些坑,特别是安全方面的,稍不留神就可能踩进去。
一个最常见的陷阱就是shell注入 。当你使用
subprocess.run(command_string, shell=True)
或者
os.system(command_string)
这种方式,并且
是由用户输入或外部数据拼接而成时,就可能发生。比如,你期望执行
,但如果用户输入了
,那么你的程序在
的情况下,就可能把整个根目录都删掉。这是非常危险的。
# 这是一个非常危险的例子,切勿在生产环境使用!user_input = "my_file; echo '恶意代码被执行了!'"# subprocess.run(f"echo {user_input}", shell=True) # 危险!
正确的做法是尽量避免使用
,而是将命令和参数以列表的形式传递给
或
。这样,Python会直接执行命令,不会通过shell进行解析,用户输入的数据会被当作普通参数传递,而不是命令的一部分。
# 安全的做法user_input = "my_file; echo '恶意代码被执行了!'"subprocess.run(["echo", user_input]) # 这里的 user_input 只是一个参数,不会被执行
另一个需要注意的点是编码问题 。特别是在Windows系统上,或者处理一些非UTF-8编码的输出时,
捕获到的字节串可能会导致乱码。这时候,
的
参数(或 Python 3.7+ 的
参数)就显得尤为重要,它能帮你自动解码。如果自动解码不行,你就需要手动指定
或其他适合的编码。
阻塞与非阻塞 也是一个考量。
、
以及
、
、
、
subprocess.check_output()
默认都是阻塞的,意味着你的Python程序会等待外部命令执行完毕。如果外部命令需要很长时间,你的程序就会“假死”。这时候,
就派上用场了,它可以让你启动一个子进程,然后你的Python程序可以继续执行其他任务,需要时再回来检查子进程的状态或获取其输出。
最后,资源管理 。如果你用
启动了子进程,并且重定向了标准输入/输出/错误,记得在不再需要时调用
等待子进程结束,或者在适当的时候清理资源,比如关闭文件描述符。虽然Python的垃圾回收机制通常会处理这些,但显式地管理总归是更稳妥的做法。
总之,执行系统命令是把双刃剑,它赋予了Python强大的能力,但也带来了潜在的风险。理解这些陷阱并采取正确的预防措施,才能让你的代码既强大又安全。
以上就是python 怎么执行系统命令_python执行系统命令方法汇总的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1371320.html
赞 (0)
打赏
微信扫一扫
支付宝扫一扫
相关推荐
灵活展示图片:如何不拉伸不裁剪 在界面设计中,常常需要以原尺寸展示用户上传的图片。本文将介绍一种在 uniapp 框架中实现该功能的简单方法。 对于不同尺寸的图片,可以采用以下处理方式: 极端宽高比:撑满屏幕宽度或高度,再等比缩放居中。非极端宽高比:居中显示,若能撑满则撑满。 然而,如果需要不拉伸不…
如何在不影响用户界面的情况下实现控制台乱码? 当在小说网站上下载小说时,大家可能会遇到一个问题:网站上的文本在网页内正常显示,但是在控制台中却是乱码。如何实现此类操作,从而在不影响用户界面(UI)的情况下保持控制台乱码呢? 答案在于使用自定义字体。网站可以通过在服务器端配置自定义字体,并通过在客户端…
地图上气泡信息框的巧妙生成 地图上气泡信息框是一种常用的交互功能,它简便易用,能够为用户提供额外信息。本文将探讨如何借助地图库的功能轻松创建这一功能。 利用地图库的原生功能 大多数地图库,如高德地图,都提供了现成的信息窗体和右键菜单功能。这些功能可以通过以下途径实现: 高德地图 JS API 参考文…
如何实现元素scrollleft变化时的平滑动画效果? 在许多网页应用中,滚动容器的水平滚动条(scrollleft)需要频繁使用。为了让滚动动作更加自然,你希望给scrollleft的变化添加动画效果。 解决方案:scroll-behavior 属性 要实现scrollleft变化时的平滑动画效果…
给滚动元素平滑过渡 如何在滚动条属性(scrollleft)发生改变时为元素添加平滑的过渡效果? 解决方案:scroll-behavior 属性 为滚动容器设置 scroll-behavior 属性可以实现平滑滚动。 html 代码: click the button to slide right!…
灵活选择元素个数不固定的指定类名子元素 在网页布局中,有时需要选择特定类名的子元素,但这些元素的数量并不固定。例如,下面这段 html 代码中,activebar 和 item 元素的数量均不固定: *n *n 如果需要选择第一个 item元素,可以使用 css 选择器 :nth-child()。该…
使用 svg 实现自定义虚线边框 如何实现一个具有自定义宽度、间距和半径的虚线边框是一个常见的前端开发问题。传统的解决方案通常涉及使用 border-image 引入切片图片,但是这种方法存在引入外部资源、性能低下的缺点。 为了避免上述问题,可以使用 svg(可缩放矢量图形)来创建纯代码实现。一种方…
如何跨越localhost使用本地图片? 问题: 在本地使用mask js库时,引入本地图片会报跨域错误。 解决方案: 要解决此问题,需要使用本地服务器启动文件,以http或https协议访问图片,而不是使用file://协议。例如: python -m http.server 8000 然后,可以…
如何让 元素跟随文本高度,而不是撑高父容器 在页面布局中,经常遇到父容器高度被子元素撑开的问题。在图例所示的案例中,父容器被较高的图片撑开,而文本的高度没有被考虑。本问答将提供纯css解决方案,让图片跟随文本高度,确保父容器的高度不会被图片影响。 解决方法 为了解决这个问题,需要将图片从文档流中脱离…
css元素设置em和transition后,为何载入无放大效果 很多开发者在设置了em和transition后,却发现元素载入页面时无放大效果。本文将解答这一问题。 原问题:在视频演示中,将元素设置如下,载入页面会有放大效果。然而,在个人尝试中,并未出现该效果。这是由于macos和windows系统…
解决 css mask 属性未请求图片的问题 在使用 css mask 属性时,指定了图片地址,但网络面板显示未请求获取该图片,这可能是由于浏览器兼容性问题造成的。 问题 如下代码所示: 立即学习“前端免费学习笔记(深入)”; icon [data-icon=”cloud”] { –icon-cl…
如何利用 css 选中激活标签并影响相邻元素? 为了实现激活标签影响相邻元素的样式需求,可以通过 :has 选择器来实现。以下是如何具体操作: 对于激活标签相邻后的元素,可以在 css 中使用以下代码进行设置: li:has(+li.active) { border-radius: 0 0 10px…
win10设置界面的鼠标移动显示周边的样式(探照灯效果)的实现方式 在windows设置界面的鼠标悬浮效果中,光标周围会显示一个放大区域。在前端开发中,可以通过多种方式实现类似的效果。 使用css 使用css的transform和box-shadow属性。通过将transform: scale(1.…
Win10设置界面中的鼠标移动探照灯效果实现指南 想要在前端开发中实现类似于Windows 10设置界面的鼠标移动探照灯效果,有两种解决方案:CSS 和 HTML/JS 组合。 CSS 实现 不幸的是,仅使用CSS无法完全实现该效果。 立即学习“前端免费学习笔记(深入)”; HTML/JS 实现 要…
为什么在 Safari 中自定义样式表未能正常工作? 在 Safari 的偏好设置中设置自定义样式表后,您对其进行测试却发现效果不同。在您自己的网页中,样式有效,而在百度页面中却失效。 造成这种情况的原因是,第一个访问的项目使用了文件协议,可以访问本地目录中的图片文件。而第二个访问的百度使用了 ht…
如何在前端实现 Windows 10 设置界面中的鼠标移动探照灯效果 想要在前端开发中实现 Windows 10 设置界面中类似的鼠标移动探照灯效果,可以通过以下途径: CSS 解决方案 DEMO 1: Windows 10 网格悬停效果:https://codepen.io/tr4553r7/pe…
探索在前端中实现 Windows 10 设置界面鼠标移动时的探照灯效果 在前端开发中,鼠标悬停在元素上时需要呈现类似于 Windows 10 设置界面所展示的探照灯效果,这其中涉及到了元素外围显示光圈效果的技术实现。 CSS 实现 虽然 CSS 无法直接实现探照灯效果,但可以通过以下技巧营造出类似效…
css mask属性未能加载图片的解决方法 使用css mask属性指定图片url时,如示例中所示: mask: url(“https://api.iconify.design/mdi:apple-icloud.svg”) center / contain no-repeat; 但是,在网络面板中却…
为元素添加时尚的斑马线边框 在网页设计中,有时我们需要添加时尚的边框来提升元素的视觉效果。其中,斑马线边框是一种既醒目又别致的设计元素。 实现斜向斑马线边框 要实现斜向斑马线间隔圆环,我们可以使用css paint api。该api提供了强大的功能,可以让我们在元素上绘制复杂的图形。 立即学习“前端…
如何让图片不撑高父容器? 当父容器包含不同高度的子元素时,父容器的高度通常会被最高元素撑开。如果你希望父容器的高度由文本内容撑开,避免图片对其产生影响,可以通过以下 css 解决方法: 绝对定位元素: .child-image { position: absolute; top: 0; left: …