gpt4 book ai didi

python - 在 Python 中, open(file).read() 和 subprocess( ['cat' , file]) 之间有什么区别,两者之间是否存在偏好?

转载 作者:行者123 更新时间:2023-12-05 00:57:06 27 4
gpt4 key购买 nike

假设我想从 /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 命令有点hackish,可能取决于系统,但我找不到任何关于此的信息,所以我想我会问。

最佳答案

...那么,让我们来看看 output = subprocess.check_output('cat /proc/meminfo', shell=True)做:

  • 使用 mkfifo() 创建一个 FIFO 对, 并产生一个运行 sh -c 'cat /proc/meminfo' 的 shell 写入 FIFO 的输入端(而 Python 解释器本身监视另一端的输出,使用 select() 调用或阻塞 IO 操作)。这意味着打开 /bin/sh 、打开它所依赖的所有库等
  • shell 将这些参数解析为代码。这可能是危险的,而不是打开 /proc/meminfo .您正在打开 /tmp/$(rm -rf ~)/pwned.txt .
  • shell 派生一个子进程(可选;shell 可能有一个隐式的 exec ),然后使用 execve系统调用 /bin/cat argv 为 ['cat', '/proc/meminfo'] -- 意思是 /bin/cat再次作为可执行文件加载,带有其动态库,以及所有暗示的性能开销。
  • /bin/cat然后打开 /proc/meminfo ,从中读取并写入其标准输出
  • shell,如果它没有使用隐式- exec优化,等待/bin/cat可执行文件以使用 wait() 完成并退出-家庭系统调用。
  • Python 解释器从 FIFO 的远程端读取,直到它提供 EOF(直到 cat 关闭其输出管道后才会发生,可能通过退出),然后使用 wait() -family 调用以检索有关它生成的 shell 如何退出的信息,检查退出状态以确定是否发生错误。


  • 现在,让我们看看 open('/proc/meminfo').read()做:
  • 使用 open() 打开文件系统调用。
  • 使用 read() 读取文件系统调用。
  • 删除文件上的引用计数,允许使用 close() 关闭(立即或在 future 的垃圾收集过程中)系统调用。

  • 其中之一是很多,很多, 比另一个更有效,更明智。

    关于python - 在 Python 中, open(file).read() 和 subprocess( ['cat' , file]) 之间有什么区别,两者之间是否存在偏好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35020613/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com