通常这不是什么大问题,因为通过 STDIN/STDOUT 传递数据很简单。
但我正在开发一个 diff 工具,它有两个输入和一个输出。
考虑:
diff <(curl 'http://google.com') <(curl 'https://google.com')
5c5
< <A HREF="http://www.google.com/">here</A>.
---
> <A HREF="https://www.google.com/">here</A>.
现在这对于一个普通的旧 python 程序来说很好,因为我可以open(sys.argv[1], 'r').read()
为 argv[1] 和 argv[2] 获取数据。
问题是我的区别是 google_diff_match_patch 的 C++ 实现,为了简单起见,我调用了该程序(它argv
使用wifstream
、wstring
和读取它的 s getline
)。
所以现在必须发生的事情是我必须“给” my/dev/fd/11
给 my subprocess.Popen(['dmp'])
,除非我似乎无法将路径(通常是)/dev/fd/11
和/dev/fd/12
in 作为dmp
C++ 程序的 args 填充,因为它/dev/fd/11
不是我的python 程序的/dev/fd/11
.
为了进一步混淆这个问题,我必须在将文件发送给孩子之前读出文件的内容,因为我使用file
的是“二进制文件”oracle:
file_process = Popen(['file', '-'], stdin=PIPE, stdout=PIPE)
file_content = open(filename, 'r').read()
(filetype, err) = file_process.communicate(file_content)
if filetype.find('text') == -1:
# Popen my c++ program and try to feed it file_content
请不要给出“写入文件”之类的答案。我想实现这些输入重定向fifo,这样我就可以像使用任何其他命令行差异一样有效地使用该程序(例如,这包括curl
在不保存到文件的情况下从网上获取某些内容)。
编辑:根据subprocess
孩子应该继承文件描述符,如果close_fds
参数是False的默认值。好的,所以这似乎表明如果在我的 python 包装程序中我调用open('/dev/fd/11')
并且不关闭它,然后使用 fork 一个孩子Popen()
,那个孩子应该能够以某种方式读取文件描述符 11。
好的,那么现在我有了 python 文件描述符 11 的内容,我该如何设置一个文件供孩子阅读?例如,如何复制 shell 的功能<(echo file contents)
(不使用shell=True
and echo
,我知道我现在应该这样做)