Pythonからプログラムを実行するにはどうしたらいいですか? os.system fails due to spaces in path.

外部プログラムを実行する必要のあるPythonスクリプトがありますが、何らかの理由で失敗します。

以下のようなスクリプトがあるとします。

import os;
os.system("C:\\Temp\\a b c\\Notepad.exe");
raw_input();

とすると、以下のようなエラーで失敗します。

'C:‾Temp‾a'は、内部または外部のコマンド、操作可能なプログラム、バッチファイルとして認識されません。

プログラムを引用符でエスケープすると

import os;
os.system('"C:\\Temp\\a b c\\Notepad.exe"');
raw_input();

とすると、動作します。しかし、パラメータを追加すると、再び動作しなくなります。

import os;
os.system('"C:\\Temp\\a b c\\Notepad.exe" "C:\\test.txt"');
raw_input();

プログラムを実行し、完了するのを待つにはどのような方法がありますか?これは仕事をしてただ終了するだけの視覚的なプログラムなので、そこからの出力を読む必要はありませんが、完了するまで待つ必要があります。

また、プログラムをスペースのないパスに移動させることもできません。


これもうまくいきません。

import os;
os.system("'C:\\Temp\\a b c\\Notepad.exe'");
raw_input();

シングル/ダブルクォートが入れ替わっていることに注意してください。

ここでメモ帳にパラメータがあってもなくても、エラーメッセージで失敗します。

ファイル名、ディレクトリ名、またはボリュームラベルの構文が正しくありません。

ソリューション

subprocess.callは、様々なシェルの引用規則に対処しなければならないという問題を回避します。文字列ではなく、リストを受け取るので、引数をより簡単に区切ることができます。

import subprocess
subprocess.call(['C:\\Temp\\a b c\\Notepad.exe', 'C:\\test.txt'])
解説 (9)

ここでは、別の方法をご紹介します。

Windowsを使用している場合、次の方法は、エクスプローラでファイルをダブルクリックしたり、DOSの"start"コマンドの引数としてファイル名を与えたりするのと同じように動作します。

filepath = 'textfile.txt'
import os
os.startfile(filepath)

import os
os.startfile('textfile.txt')

これは、Notepadが.txtファイルに関連付けられている場合、textfile.txtをNotepadで開きます。

解説 (3)

Windowsでショートカットを使ったときと同じ問題ではないかと思うのですが...。これを試してみてください。

import os;
os.system("\"C:\\Temp\\a b c\\Notepad.exe\" C:\\test.txt");
解説 (4)