在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是如何自动创建一个文件描述符,并允许您将程序的输出传递给另一个程序。
现在到我的问题:如何在Python中使用Popen在子进程模块中做同样的事情?
我一直在使用kmers的正常文件,只是读它,但我的程序现在基于用户参数在运行时生成一个特定的kmers列表。我想避免手动写入临时文件,因为处理文件权限可能会对我的原始用户造成问题。
这里是我的代码运行了一个程序,用一个实际的文件捕获标准输出“kmer_file”
input_file = Popen(["pram_axdnull", str(kmer), input_file, kmer_file], stdout=PIPE)
我创建了一个名为generate_kmers函数返回一个可以很容易地写出到一个文件中的字符串(包括换行符)或一个StringIO。我也有一个Python脚本,是独立做同样的事情
所以现在我想在把它作为我的第3个参数:
这不起作用:
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选项并使用<()的实际双击,但我没有想到这一点。
谢谢!
相关:[在子进程多个管道(http://stackoverflow.com/q/28840575/4279) – jfs 2015-09-22 10:51:15