在 Bash 中,您可以轻松地将进程的输出重定向到临时文件描述符,并且所有这些都由 bash 自动处理,如下所示:
$ mydaemon --config-file <(echo "autostart: True \n daemonize: True")
或像这样:
$ wc -l <(ls)
15 /dev/fd/63
看看它不是标准输入重定向:
$ vim <(echo "Hello World")
vim opens a text file containing "Hello world"
$ echo "Hello World" | vim
Vim: Warning: Input is not from a terminal
您可以在第二个示例中看到 bash 如何自动创建文件描述符并允许您将程序的输出传递给另一个程序。
现在我的问题是:如何在子进程模块中使用 Popen 对 Python 做同样的事情?
我一直在使用普通的 kmers 文件并将其读入,但我的程序现在根据用户参数在运行时生成一个特定的 kmers 列表。我想避免手动写入临时文件,因为处理文件权限可能会给我的原始用户带来问题。
这是我运行程序并使用实际文件“kmer_file”捕获标准输出的代码
input_file = Popen(["pram_axdnull", str(kmer), input_file, kmer_file], stdout=PIPE)
我创建了一个名为 generate_kmers 的函数,它返回一个可以轻松写入文件(包括换行符)或 StringIO 的字符串。我也有一个独立的 python 脚本来做同样的事情
所以现在我想将它作为我的第三个参数传递:
这不起作用:
kmer_file = stringIO(generate_kmers(3))
input_file = Popen(["pram_axdnull", str(kmer), input_file, kmer_file], stdout=PIPE)
这也不是:
kmer_file = Popen(["generate_kmers", str(kmer)], stdout=PIPE)
input_file = Popen(["pram_axdnull", str(kmer), input_file, kmer_file.stdout], stdout=PIPE)
所以我没有想法。
有谁知道解决这个问题的好方法?我正在考虑使用 shell=True 选项并使用 <() 的实际bashism,但我还没有弄清楚。
谢谢!