在Python中,open(file).read()和subprocess([‘cat’,file])之间有什么区别,并且优先于另一个吗?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了在Python中,open(file).read()和subprocess([‘cat’,file])之间有什么区别,并且优先于另一个吗?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1754字,纯文字阅读大概需要3分钟。
内容图文
![在Python中,open(file).read()和subprocess([‘cat’,file])之间有什么区别,并且优先于另一个吗?](/upload/InfoBanner/zyjiaocheng/682/4fd06c505e0048c6bee020ecd79ed952.jpg)
假设我要从/ proc / meminfo读取RAM使用情况.我可以想到两种基本方法.
使用shell命令
output = subprocess.check_output('cat /proc/meminfo', shell=True)
# or output = subprocess.check_output(['cat', '/proc/meminfo'])
lines = output.splitlines()
使用open()
with open('/proc/meminfo') as meminfo:
output = meminfo.read()
lines = output.splitlines()
我的问题是两种方法有什么区别?有明显的性能差异吗?我的假设是使用open()是首选方法,因为使用shell命令有点hacker,并且可能与系统有关,但是我找不到关于此的任何信息,所以我想问一下.
解决方法:
…所以,让我们看一下输出= subprocess.check_output(‘cat / proc / meminfo’,shell = True)的作用:
>使用mkfifo()创建一个FIFO对,并生成一个运行sh -c’cat / proc / meminfo’的外壳,将其写入FIFO的输入端(而Python解释器本身会在另一端监视输出,或者使用select()调用或阻止IO操作).这意味着打开/ bin / sh,打开它依赖的所有库,等等.
> Shell将这些参数解析为代码.如果不是打开/ proc / meminfo,这可能很危险.而是打开/ tmp / $(rm -rf?)/pwned.txt.
> Shell派生一个子进程(可选; Shell可能具有隐式exec),然后使用execve系统调用以argv为[‘cat’,’/ proc / meminfo’]的方式调用/ bin / cat-这意味着/ bin / cat和它的动态库再次作为可执行文件加载,并隐含了所有性能开销.
> / bin / cat然后打开/ proc / meminfo,从中读取并写入其标准输出
>如果外壳程序未使用隐式exec优化,则会使用wait()-family syscall等待/ bin / cat可执行文件完成并退出.
> Python解释器从FIFO的远程端读取数据,直到它提供EOF(直到cat关闭其输出管道(可能是通过退出)之后才会发生),然后使用wait()-family调用来检索信息它产生的外壳如何退出,检查退出状态以确定是否发生错误.
现在,让我们看一下open(‘/ proc / meminfo’).read()的作用:
>使用open()系统调用打开文件.
>使用read()系统调用读取文件.
>删除文件上的引用计数,从而允许使用close()系统调用将其关闭(立即或在以后的垃圾回收过程中关闭).
其中一件事情比另一件事情要高效得多,而且通常更为明智.
内容总结
以上是互联网集市为您收集整理的在Python中,open(file).read()和subprocess([‘cat’,file])之间有什么区别,并且优先于另一个吗?全部内容,希望文章能够帮你解决在Python中,open(file).read()和subprocess([‘cat’,file])之间有什么区别,并且优先于另一个吗?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。