ドキュメントによると、Rscript:
…は#で使用するための代替フロントエンドです!スクリプトおよびその他のスクリプトアプリケーション。
…書くのに便利です#!スクリプト…(標準のWindowsコマンドラインには#!スクリプトの概念はありませんが、Cygwinシェルにはあります。)
…は、execvシステムコールのあるシステムでのみサポートされます。
したがって、Windowsで別のプログラムからRスクリプトを実行する方法ではありません。
この答えは言う:
Rscript.exeはバッチスクリプトの友です…他のすべてには、R.exeがあります
したがって、バッチスクリプトの外部でRscriptを使用する正当な理由がない限り、R.exeに切り替える必要があります。
なぜそれがcmd.exeの下で機能するのか、Pythonからは機能しないのか不思議に思うかもしれません。その答えはわかりません。コードを調べたり、実験して調べたりする価値はないと思いますが、推測することはできます。
1つの可能性は、コマンドラインから実行している場合cmd.exe
はターミナルを制御し、subprocess.call(shell=True)
またはから実行している場合os.system
はヘッドレスであるということですcmd.exe
。.bat / .cmdバッチファイルを実行すると、ヘッドレスではなくなりますが、別のアプリから直接cmd
実行しても、そうではありません。cmd
Rはこれまで、Windowsターミナルを扱うあらゆる種類の複雑さを抱えていました。そのため、Rterm.exeツールとRcmd.exeツールを別々に使用していました。現在、これらは両方ともR.exeにマージされており、どちらの方法でも問題なく動作するはずです。しかし、ドキュメントに記載されていないことを実行しようとすると、テストされない可能性があり、機能しない可能性があることは完全に合理的です。
いずれにせよ、文書化されていなくても、状況によってはなぜ機能するのかは問題ではありません。それは確かに、それが動作するように文書化されていない他の状況で動作する必要があること、または強制的に動作させるようにする必要があることを意味するものではありません。正しいことをして、R.exe
代わりに実行してくださいRscript.exe
。
私がドキュメントで見つけたすべてのものと矛盾する情報がない限り、そして私が見つけることができる他のすべての場所で、私はRscript.exe自体にお金をかけています。
Rscript.exe
との呼び出しの違いに関するドキュメントを読む必要がありますR.exe
が、それらは同一ではありません。イントロドキュメントによると、:
Rコマンドのファイルfoo.Rを実行するだけの場合は、R CMDBATCHfoo.Rを使用することをお勧めします。
上記のコメントによると:
「C:\ R \ R-2.15.2 \ bin \ i386 \ R.exe」と入力すると、cmd BATCH C:\ python \ buyback_parse_guide.rをcmd.exeに入力すると、.Rスクリプトが正常に実行されます。これをPythonに渡すための適切な構文は何ですか?
それはプラットフォームによって異なります。Windowsでは、引数のリストが文字列に変換されるため、結合をデバッグする必要がないように、文字列を使用する方が適切です。Unixでは、文字列は引数のリストに分割されるため、結合をデバッグする必要がないように、リストを使用することをお勧めします。
パスにスペースがないので、引用符を外します。
それで:
rcmd = r'C:\R\R-2.15.2\bin\i386\R.exe CMD BATCH C:\python\buyback_parse_guide.r'
retval = subprocess.call(rcmd)