大多数语言都支持双向处理 通讯 </跨度> 。例如,在Python中,我可以(懒散地)做:
&GT;&GT;&GT;来自子进程导入*&GT;&GT;&GT; p = Popen(‘nslookup’,stdin = PIPE,stdout = PIPE)&GT;&GT;&GT; p_stdin通过R -f …或R&lt; …,在实际的控制台stdin / stdout中发生了奇怪的行为。
我的问题归结为以下内容 - 是否有可能(无需编写C方法!)来重现双向过程 通讯 </跨度> 在R中的上述Python示例中? 锟斤拷
可以像这样在R中运行Jython中的那个部分。加载java(发生在第二个语句中)将会很慢,但之后应该没问题。
library(rJython) .Jython <- rJython() jython.assign(.Jython, "x", "www.google.com") jython.exec(.Jython, "from subprocess import * p = Popen('nslookup', stdin=PIPE, stdout=PIPE) p_stdin, p_stdout = p.communicate(x)") cat(jython.get(.Jython, "p_stdin"), "\n\n")
最后一条陈述给出:
> cat(jython.get(.Jython, "p_stdin"), "\n\n") Default Server: UnKnown Address: 192.168.0.1 > www.google.com
在类UNIX系统上执行此操作的一种方法是打开到重定向进程的管道 stdout 和 stderr 到了一个fifo:
stdout
stderr
# Setup system('mkfifo output.fifo') p_out <- fifo('output.fifo', 'r') p_in <- pipe('pdflatex &> output.fifo', 'w') # See what TeX said on startup readLines(p_out) [1] "This is pdfTeX, Version 3.1415926-1.40.11 (TeX Live 2010)" readLines(p_out) character(0) # TeX has nothing more to say # Tell TeX to do something writeLines('\\documentclass{article}', p_in) flush(p_in) # See what it said in response readLines(p_out) [1] "**entering extended mode" [2] "LaTeX2e <2009/09/24>" [3] "Babel <v3.8l> and hyphenation patterns for english, dumylang, nohyphenation, ba" [4] "sque, danish, dutch, finnish, french, german, ngerman, swissgerman, hungarian, " [5] "italian, bokmal, nynorsk, polish, portuguese, spanish, swedish, loaded." [6] ""
不幸, fifo 在Windows上不受支持。
fifo
很久以前我也用过双向管道 八度 所以,是的,这将是很好的。但仔细阅读 help(pipe) 并不认为这是支持。你会得到阅读 要么 写,但似乎不是两个。
help(pipe)
但也许你可以作弊。打开一个管道写入一个应用程序,你可以调用stdout重定向到一个文件...然后继续读取该文件。但是由于没有刷新的缓冲区可能会很乱。