Pythonからプログラムを実行するにはどうすればよいですか? os.systemはパスにスペースがあるために失敗します
-
03-07-2019 - |
質問
外部プログラムを実行する必要がある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'])
他のヒント
これを行う別の方法があります。
Windowsを使用している場合、以下はエクスプローラでファイルをダブルクリックするか、DOSの引数としてファイル名を指定するような動作をします<!> quot; start <!> quot;コマンド:ファイルは、拡張子が関連付けられているアプリケーション(存在する場合)で開かれます。
filepath = 'textfile.txt'
import os
os.startfile(filepath)
例:
import os
os.startfile('textfile.txt')
メモ帳が.txtファイルに関連付けられている場合、これはtextfile.txtをメモ帳で開きます。
最も外側の引用符はPython自体によって消費され、Windowsシェルはそれを認識しません。前述のように、Windowsは二重引用符のみを認識します。 PythonはWindowsでスラッシュをバックスラッシュに変換するので、使用できます
os.system('"C://Temp/a b c/Notepad.exe"')
'はPythonによって消費され、<!> quot; C:// Temp / a b c / Notepad.exe <!> quot;を渡します。 (Windowsパスとして、二重バックスラッシュは必要ありません)CMD.EXE
少なくともWindows 7およびPython 3.1では、コマンドへのパスにスペースがある場合、Windowsのos.system
はコマンドライン二重引用符を必要とします。例:
TheCommand = '\"\"C:\\Temp\\a b c\\Notepad.exe\"\"'
os.system(TheCommand)
私を困惑させた実世界の例は、VirtualBoxでドライブを複製することでした。上記のsubprocess.call
ソリューションは、アクセス権の問題のため機能しませんでしたが、コマンドを二重引用符で囲むと、<=>が幸せになりました:
TheCommand = '\"\"C:\\Program Files\\Sun\\VirtualBox\\VBoxManage.exe\" ' \
+ ' clonehd \"' + OrigFile + '\" \"' + NewFile + '\"\"'
os.system(TheCommand)
import win32api # if active state python is installed or install pywin32 package seperately
try: win32api.WinExec('NOTEPAD.exe') # Works seamlessly
except: pass
Windowsでショートカットを使用するときと同じ問題だと思われます...これを試してください:
import os;
os.system("\"C:\\Temp\\a b c\\Notepad.exe\" C:\\test.txt");
Pythonの場合<!> gt; = 3.5 subprocess.run
をsubprocess.call
https://docs.python.org /3/library/subprocess.html#older-high-level-api
import subprocess
subprocess.run(['notepad.exe', 'test.txt'])
パス('/home/<you>/<first-path-section> <second-path-section>'
)の間にスペースがあるDjango Webサーバー(Linuxの場合)を実行する場合、次のようにします。
import subprocess
args = ['{}/manage.py'.format('/home/<you>/<first-path-section> <second-path-section>'), 'runserver']
res = subprocess.Popen(args, stdout=subprocess.PIPE)
output, error_ = res.communicate()
if not error_:
print(output)
else:
print(error_)
[注]:
- アクセス許可を忘れないでください:
chmod 755 -R <'yor path'>
-
manage.py
は実行可能です:chmod +x manage.py