gpt4 book ai didi

python - 从 python 调用需要文件的 shell 脚本而不将文件写入磁盘

转载 作者:太空宇宙 更新时间:2023-11-03 19:09:28 25 4
gpt4 key购买 nike

为了简化起见,我们假设 shell 脚本是 cat 命令。在 shell 中通常会这样调用:

$ cat /some/path/myfile.txt

现在,文件将被动态创建,将其写入磁盘将严重影响性能,带来安全问题,并增加多用户环境中的文件管理开销。该脚本无法修改,也无法从标准输入读取(cat 只是一个工作示例)。

我尝试过这个:

import os
pin, pout = os.pipe()
pin, pout = os.fdopen(pin, 'r'), os.fdopen(pout,'w')

from subprocess import Popen
pout.write("test")
pout.flush()
p = Popen('cat /proc/self/fd/%s' % pout.fileno(), shell=True)

即使我关闭 pout p.poll() 仍然没有返回任何内容,表明该命令仍在等待来自管道的更多输入。

如何告诉命令管道中不再有数据?还有其他方法可以解决这个问题吗?

编辑

在 bash 中,如果文件内容是由名为 prog1 的程序生成的,则可以通过以下方式解决:

$ cat <(prog1)

编辑2

如果您不需要 shell,那么 Alfe 提到的其他选项更好,尽管问题仍然存在(即读取文件内容后该过程尚未完成)

#...same as before
p = Popen(['cat', '/dev/stdin'], stdin=pout)

最佳答案

这就是我最后所做的,但并不好。

因为我正在 CentOS 上工作并且遇到了问题(我在这里询问过: Python Popen can't open bash shell in CentOS/Red Hat )我无法使用 execute='/bin/bash'这就是为什么解决方案看起来与问题有点不同。

我使用 bash 进程替换和此处文档将一些配置传递给进程:

file_contents = '...'
p = Popen(['/bin/bash', '-c', "cat <(cat<<'EOF_CFG'\n%s\nEOF_CFG\n)" % file_contents])

我现在正在考虑使用 tmpfs 在其上创建命名管道。我认为首先启动脚本然后写入管道应该可以...如果我成功了,我也会在这里写它。

关于python - 从 python 调用需要文件的 shell 脚本而不将文件写入磁盘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13512016/

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