295

外部プログラムを実行する必要がある 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();

一重引用符と二重引用符が入れ替わっていることに注意してください。

ここでメモ帳へのパラメーターの有無にかかわらず、エラーメッセージで失敗します

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

4

10 に答える 10

308

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

import subprocess
subprocess.call(['C:\\Temp\\a b c\\Notepad.exe', 'C:\\test.txt'])
于 2008-10-15T08:37:39.200 に答える
81

別の方法を次に示します。

Windows を使用している場合、次の操作は、エクスプローラーでファイルをダブルクリックするか、DOS の「開始」コマンドの引数としてファイル名を指定するのと同じように機能します。ファイルは、その拡張子が関連付けられているアプリケーション (存在する場合) で開かれます。 .

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

例:

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

メモ帳が .txt ファイルに関連付けられている場合、メモ帳で textfile.txt が開きます。

于 2008-10-15T20:09:37.587 に答える
35

最も外側の引用符は Python 自体によって消費され、Windows シェルはそれを認識しません。前述のように、Windows は二重引用符のみを認識します。Python は、Windows ではスラッシュをバックスラッシュに変換するので、次を使用できます。

os.system('"C://Temp/a b c/Notepad.exe"')

' は Python によって消費され、次に "C://Temp/abc/Notepad.exe" を CMD.EXE に (Windows パスとして、2 つのバックスラッシュは必要ありません) 渡します。

于 2009-05-26T18:13:51.810 に答える
20

少なくとも Windows 7 と Python 3.1 では、コマンドへのパスにスペースがある場合os.system、Windows はコマンド ラインを二重引用符で囲みます。例えば:

  TheCommand = '\"\"C:\\Temp\\a b c\\Notepad.exe\"\"'
  os.system(TheCommand)

私を困惑させた実際の例は、VirtualBox でドライブを複製することでした。上記のsubprocess.call解決策は、アクセス権の問題のために機能しませんでしたが、コマンドを二重引用符で囲むと、うまくいきos.systemました。

  TheCommand = '\"\"C:\\Program Files\\Sun\\VirtualBox\\VBoxManage.exe\" ' \
                 + ' clonehd \"' + OrigFile + '\" \"' + NewFile + '\"\"'
  os.system(TheCommand)
于 2009-10-26T01:33:47.333 に答える
10
import win32api # if active state python is installed or install pywin32 package seperately

try: win32api.WinExec('NOTEPAD.exe') # Works seamlessly
except: pass
于 2010-04-30T07:08:44.977 に答える
3

Windowsでショートカットを使用する場合と同じ問題だと思います...これを試してください:

import os;
os.system("\"C:\\Temp\\a b c\\Notepad.exe\" C:\\test.txt");
于 2008-10-15T08:27:05.633 に答える
0

サブプロセスの必要はありません、それは簡単に実現できます

GitPath="C:\\Program Files\\Git\\git-bash.exe"# Application File Path in mycase its GITBASH
os.startfile(GitPath)
于 2020-04-26T04:32:59.230 に答える