他のアプリケーションを実行する

 Iron Pythonから直接メモ帳などのアプリケーションを実行することをやってみましょう。

 コマンドプロンプトのコマンドを実行する

 Pythonだったら、次のスクリプトでコマンドプロンプトでコマンドを実行することが出来きます。

import os
os.system("notepad.exe") ←メモ帳を起動しています。

これはDOSプロンプトで"notepad.exe"と入力したことを同じことをしています。ちゃんとメモ帳が起動しましたよねえ。同じことをNET Frameworkを使うとどうするかやってみます。

import System
from System.Diagnostics import Process

Process.Start("notepad.exe")

上で示しているように名前空間System.DiagnosticsにあるProcessクラスのStartメゾットを使います。 う〜ん一行多い。なんか負けてしまった気もするけど、そうでもない。Pythonの場合はメモ帳が起動している間はPythonの黒い画面が裏で動いていますが、NET Frameworkだとメモ帳が起動すると、スクリプトが終了するので、黒い画面が消えます。なんとなく、この部分では勝った気がする。(笑)

また次のようにすれば、コマンドに引数を渡すことが出来ます。

import System
from System.Diagnostics import Process

Process.Start("notepad.exe","test.txt")

上の例では、メモ帳に開くファイル名を渡しています。

 コマンドの出力を表示する

 本家Pythonの方が簡単にできるなぁと感じるのが、コマンドプロンプトのコマンド出力を表示することです。例えばこんな風です。

import os
os.system("dir c:\\")

raw_input()

出力画面:
ドライブ C のボリューム ラベルがありません。
 ボリューム シリアル番号は 70CF-6707 です
 
 c:\ のディレクトリ
 
 2007/02/17 13:20 <DIR> ATI
 2005/03/03 13:05 0 AUTOEXEC.BAT
 2010/12/16 01:14 <DIR> Config.Msi
 2005/03/03 13:05 0 CONFIG.SYS
 2006/09/23 20:04 <DIR> Documents and Settings
 2009/11/23 12:38 <DIR> Perl
 2010/12/01 20:35 <DIR> Program Files
 2010/10/11 23:25 <DIR> Python27
 2010/12/23 17:31 <DIR> WINDOWS
        2 個のファイル 0 バイト
        7 個のディレクトリ 66,358,726,656 バイトの空き領域
これを.NET Frameworkを使ってやろうとするとかなり複雑になります。

import System
from System.Diagnostics import Process, ProcessStartInfo

まず使うクラスですが、先程の名前空間System.DiagnosticsのProcessクラスとProcessのStartメゾットを使う環境の情報を提供するProcessStartInfoを使います。ではそのProcessStartInfoクラスを用いて環境を整理しましょう。

psInfo = ProcessStartInfo()      ←1行目
psInfo.FileName = "C:\\windows\\system32\\cmd.exe" ←2行目
psInfo.Arguments = "/c dir c:\\"   ←3行目
psInfo.CreateNoWindow = True     ←4行目
psInfo.UseShellExecute = False    ←5行目
psInfo.RedirectStandardOutput = True ←6行目

1行目でProessStartInfoクラスのオブジェクトを生成します。
2行目で実行ファイル名を指定します。Windowsのコマンドプロンプトの実行ファイルは"cmd.exe"というファイルになります。
3行目では実行ファイルに渡す引数を指定します。"/c"はcmd.exeのオプションで、"文字列" に指定されたコマンドを実行した後、終了することを指定します。
4行目はプロセスを新しいウィンドウで起動するかどうかを設定します。今回は設定しません。
5行目はプロセスの起動にオペレーティング システムのシェルを使用するか設定します。シェルっていうのは、ユーザーがキーボードやマウスで行った作業に対して、機械が分かるように翻訳をして、機械に伝える機能のこと。例えばコマンドプロンプトで、Excelのファイル名を入力するだけで、シェル機能が判断してExcelアプリケーションを起動させて、Excelファイルを開きます。簡単に言うとユーザー補助機能なようなもの。今回はシェル機能は使わないのでFalseに設定します。
6行目はコマンドの出力を Process.StandardOutputに書き込むように設定しています。

人間同士なら、「分かるじゃん」の一言で終わってしまうことでも機械にはいちいち設定しないといけません。面倒くさいけど、それがプログラミングだと思います。

p = Process.Start(psInfo)        ←1行目
output = p.StandardOutput.ReadToEnd()  ←2行目
print output               ←3行目

1行目で先程作ったProcessStartInfoオブジェクトを使ってプロセスを実行させ、そのプロセスオブジェクトを取得します。
2行目はProcess.StandardOutputの内容を最後まで取得します。
3行目で表示です。

いやー長いです。Pythonで2行で出来ることをいったい何行かけてやるのだか・・・。全部まとめると次のようになります。

import System
from System.Diagnostics import Process, ProcessStartInfo

psInfo = ProcessStartInfo()
psInfo.FileName = "C:\\windows\\system32\\cmd.exe"
psInfo.Arguments = "/c dir c:\\"
psInfo.CreateNoWindow = True
psInfo.UseShellExecute = False
psInfo.RedirectStandardOutput = True

p = Process.Start(psInfo)
output = p.StandardOutput.ReadToEnd()
print output

raw_input()

出力画面:
ドライブ C のボリューム ラベルがありません。
 ボリューム シリアル番号は 70CF-6707 です
 
 c:\ のディレクトリ
 
 2007/02/17 13:20 <DIR> ATI
 2005/03/03 13:05 0 AUTOEXEC.BAT
 2010/12/16 01:14 <DIR> Config.Msi
 2005/03/03 13:05 0 CONFIG.SYS
 2006/09/23 20:04 <DIR> Documents and Settings
 2009/11/23 12:38 <DIR> Perl
 2010/12/01 20:35 <DIR> Program Files
 2010/10/11 23:25 <DIR> Python27
 2010/12/23 17:31 <DIR> WINDOWS
        2 個のファイル 0 バイト
        7 個のディレクトリ 66,358,726,656 バイトの空き領域