2012-04-21 11 views
2

私は、コマンドPrompt.TheコードをC#のからPythonコードを実行するには、これは、コマンドプロンプトからC#のPythonコードを実行することは可能ですか?

Process p = new Process(); 
    p.StartInfo.FileName = "cmd.exe"; 
    p.StartInfo.WorkingDirectory = @"d:"; 
    p.StartInfo.WindowStyle = ProcessWindowStyle.Normal; 
    p.StartInfo.UseShellExecute = false; 
    p.StartInfo.RedirectStandardOutput = true; 
    p.StartInfo.RedirectStandardInput = true; 

    p.Start(); 
    p.StandardInput.WriteLine(@"cd D:\python-source\mypgms"); 
    p.StandardInput.WriteLine(@"main.py -i example-8.xml -o output-8.xml"); 

    string output = p.StandardOutput.ReadToEnd(); 
    p.WaitForExit(); 

    Console.WriteLine("Output:"); 
    Console.WriteLine(output); 

Output : 

D:\python-source\mypgms>main.py -i example-8.xml -o output-8.xml 

D:\python-source\mypgms> 

の下に取り付けられている。しかし、何もhappened.Actuallyのmain.pyは私のメインプログラムであり、それは2つの引数を取ります。 1つは入力XMLファイルであり、もう1つは出力XMLファイルです。

しかし、私はコマンドプロンプトからC#からこのpythonスクリプトを実行する方法を知らない。 ...この問題から抜け出すために

おかげ&よろしく、あなたのアプリケーションでIronPythonのをホストして、スクリプトを実行しないのはなぜ P.SARAVANAN

+1

あなたは何が起こると思いますか?なぜcmd.exeが必要なのでしょうか?なぜpython.exeを実行しないのですか? –

+2

ここでの主な問題は、cmd.exeがPythonコードを解釈しないことです。これを行うにはPython.exeが必要です。 –

答えて

4

私はあなたがCMD.EXEを実行する上で間違っていると思います。私はあなたがpython.exeを実行する必要があり、またはUseShellExecuteをtrueに設定してmain.pyを実行する必要があると思います。

現在のところ、cmd.exeが入力を待っているため、コードはp.WaitForExit()でブロックされます。 cmd.exeを終了させるには、exitを入力する必要があります。

p.StandardInput.WriteLine(@"exit"); 

しかし、私はただcmd.exeをすべて削除し、python.exeを直接呼び出すことができます。私が見る限りでは、cmd.exeはまったく利益のために余分な複雑さを加えるだけです。

私はあなたがこれらの線に沿って何かを必要だと思う:

var p = new Process(); 
p.StartInfo.FileName = @"Python.exe"; 
p.StartInfo.Arguments = "main.py input.xml output.xml"; 
p.StartInfo.WorkingDirectory = @"D:\python-source \mypgms"; 
p.StartInfo.WindowStyle = ProcessWindowStyle.Normal; 
p.StartInfo.UseShellExecute = false; 
p.StartInfo.RedirectStandardOutput = true; 
p.Start(); 
p.WaitForExit(); 

また、Pythonスクリプトは、ファイルにではなく、標準出力に出力するように表示されます。したがって、p.StandardOutput.ReadToEnd()を実行すると、そこには何もありません。

+0

@ThanksデビッドHeffernanのは:?それは正常に動作します...しかし、コマンドプロンプトウィンドウはすぐに自動的に閉じ、ウィンドウを防ぐためにclosed.how ... – Saravanan

+0

は多分あなたのC#コードの最後にConsole.ReadLine()を追加します。 –

2
+0

これはもう一つの選択肢ですが、実際にはここで問題に対処していません。 C#からCPythonを呼び出すことはまったく問題ありません。それはちょうど正しく行われる必要があります。確かにIronPythonのをホスティングに簡単なコードの変更ではなく、スイッチのカップルを作るために速くなるでしょうか? –

0

または実用的あなたのPythonスクリプトをexeファイルのプログラムに変換するためにpy2exeを使用しています。

詳細手順...

  • ダウンロードとpy2exeをインストールします。
  • Cであなたのmain.pyのinput.xmlにとのOutput.xmlを置く:
  • \ \ tempにはsetup.pyを作成し、あまりにも
  • setup.pyが含まれている必要があり

上のフォルダに入れて...

をあなたのC#のコードは、その後することができ
from distutils.core import setup 
import py2exe 

setup(console=['main.py']) 

...

var proc = new Process(); 
proc.StartInfo.FileName = @"Python.exe"; 
proc.StartInfo.Arguments = @"setup.py py2exe"; 
proc.StartInfo.WorkingDirectory = @"C:\temp\"; 
proc.Start(); 
proc.WaitForExit(); 

proc.StartInfo.FileName = @"C:\temp\dist\main.exe"; 
proc.StartInfo.Arguments = "input.xml output.xml"; 
proc.Start(); 
proc.WaitForExit(); 
+0

は、次にQのコードは同じ動作を与えるだろうが、ビルドプロセスに余分な合併症が存在することになります。 –

+0

同じ動作をしません。 main.pyをmain.exeに手作業で変換するか、実用的に変換するかを選択できます。 main.exeをprocessで直接呼び出します。もちろん、この方法はPythonを必要としますが、これは別のオプションです。彼はcmd.exeを経由起動し続けている場合 –

+0

それは同じ動作を行います。 Pythonのexeラッパーの全ポイントは、それらがインタプリタを通してスクリプトを実行するのと同じように動作することです。あなたの答えは根本的な問題に対処していません。 –

関連する問題