-2

を使用して、ローカルの Python ディレクトリにない .exe ファイルを呼び出そうとしていますsubprocess.call()。コマンド (cmd.exe に入力したとおり) は次のとおりです。"C:\Program Files\R\R-2.15.2\bin\Rscript.exe" --vanilla C:\python\buyback_parse_guide.r

スクリプトが実行され、必要な処理が実行され、出力が正しいことを確認しました。

これが私のpythonコードです。これはまったく同じことをすると思いました:

## Set Rcmd
Rcmd = r'"C:\Program Files\R\R-2.15.2\bin\Rscript.exe"'
## Set Rargs
Rargs = r'--vanilla C:\python\buyback_parse_guide.r'

retval = subprocess.call([Rcmd,Rargs],shell=True)

retvalPython コンソールで呼び出すと、戻り1、.R スクリプトは実行されませんが、エラーは発生しません。これは本当に単純な構文エラーだと確信しています...助けてください。どうもありがとう!

4

2 に答える 2

1

ドキュメントを引用するには:

shell が True の場合、args をシーケンスではなく文字列として渡すことをお勧めします。

それを(手動で、または経由でshlexsubprocess分割すると、それらを再結合できるため、シェルが再び分割できるようになります。

なぜここが必要だと思うのかわかりませんshell=True。(正当な理由がない場合、通常はそれを望まないでしょう...) しかし、それがなくてもshell=True:

Windows では、args がシーケンスの場合、Windows での引数シーケンスの文字列への変換で説明されている方法で文字列に変換されます。これは、基礎となる CreateProcess() が文字列を操作するためです。

したがって、シェルにコマンドラインを与えるだけです:

Rcmd = r'"C:\Program Files\R\R-2.15.2\bin\Rscript.exe" --vanilla C:\python\buyback_parse_guide.r'
retval = subprocess.call(Rcmd, shell=True)
于 2012-11-30T00:32:10.220 に答える
0

ドキュメントによると、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実行しても、そうではありません。cmdRはこれまで、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)
于 2012-11-30T01:04:45.517 に答える