<p>根据<a href="http://stat.ethz.ch/R-manual/R-patched/library/utils/html/Rscript.html" rel="nofollow noreferrer">the docs</a>,Rscript:</p>
<blockquote>
<p>… is an alternative front end for use in #! scripts and other scripting applications.</p>
<p>… is convenient for writing #! scripts… (The standard Windows command line has no concept of #! scripts, but Cygwin shells do.)</p>
<p>… is only supported on systems with the execv system call.</p>
</blockquote>
<p>因此,这不是在Windows下从另一个程序运行R脚本的方法。在</p>
<p><a href="https://stackoverflow.com/questions/3412911/difference-between-r-exe-rcmd-exe-rscript-exe-and-rterm-exe">This answer</a>说:</p>
<blockquote>
<p>Rscript.exe is your friend for batch scripts… For everything else, there's R.exe</p>
</blockquote>
<p>因此,除非您有充分的理由在批处理脚本之外使用Rscript,否则应该切换到R.exe。在</p>
<p>你可能想知道它为什么在命令提示符但不是Python的。我不知道这个问题的答案,我认为不值得通过代码挖掘或试验来找出答案,但我可以做出一些猜测。在</p>
<p>一种可能是,当您从命令行运行时,这是一个控制终端的<code>cmd.exe</code>,而当您从<code>subprocess.call(shell=True)</code>或{<cd3>}运行时,这是一个无头<code>cmd.exe</code>。运行一个.bat/.cmd批处理文件会得到一个非headless <code>cmd</code>,但直接从另一个应用程序运行<code>cmd</code>则不会。历史上,R在处理Windows终端时遇到了各种各样的复杂问题,这就是为什么它们以前有单独的Rterm.exe文件以及Rcmd.exe工具。现在,它们都被合并到R.exe中,不管怎样它都可以正常工作。但是如果你试着去做医生说不该做的事情,那可能没有经过测试,这是完全合理的,它可能不起作用。在</p>
<p>不管怎样,在某些情况下,它为什么能起作用并不重要,即使它没有被记录下来。当然,这并不意味着它应该在其他没有文档记录的情况下工作,或者您应该尝试强制它这样做。只要做正确的事情并运行<code>R.exe</code>而不是<code>Rscript.exe</code>。在</p>
<p>除非你有一些信息与我在文件中找到的所有信息以及我能找到的任何地方相矛盾,否则我会把钱押在Rscript.exe这本身就是问题所在。在</p>
<p>您必须阅读有关<code>Rscript.exe</code>和<code>R.exe</code>之间调用差异的文档,但它们并不相同。根据<a href="http://cran.r-project.org/doc/manuals/R-intro.html#Scripting-with-R" rel="nofollow noreferrer">the intro docs</a>,:</p>
<blockquote>
<p>If you just want to run a file foo.R of R commands, the recommended way is to use R CMD BATCH foo.R</p>
</blockquote>
<p>根据您的上述评论:</p>
<blockquote>
<p>When I type "C:\R\R-2.15.2\bin\i386\R.exe" CMD BATCH C:\python\buyback_parse_guide.r into cmd.exe, the .R script runs successfully. What's the proper syntax for passing this into python?</p>
</blockquote>
<p>那要看平台了。在Windows上,参数列表会变成字符串,因此最好只使用字符串,这样就不必调试连接;在Unix上,字符串被拆分为参数列表,因此最好使用列表,这样就不必调试连接。在</p>
<p>因为路径中没有空格,所以我会去掉引号。在</p>
<p>所以:</p>
<pre><code>rcmd = r'C:\R\R-2.15.2\bin\i386\R.exe CMD BATCH C:\python\buyback_parse_guide.r'
retval = subprocess.call(rcmd)
</code></pre>