LoginSignup
100
93

More than 5 years have passed since last update.

Pythonからコマンドを呼び出す(Windows編)

Last updated at Posted at 2016-08-22

基本

os.systemを使うのが従来は一般的であったが,subprocessを使うのが現代的らしい.
参考: http://stackoverflow.com/questions/4813238/difference-between-subprocess-popen-and-os-system

import subprocess

cmd = 'myprogram myargs'
returncode = subprocess.call(cmd)

簡単な呼び出しであればcallで十分だが,より汎用的かつ一般的にはPopenを使うのが良いらしい.
以下の参考文献によれば,Popenはコマンド実行をブロックしない(=コマンドが終わるのを待たずに次の行に進める)という利点があり,callはPopenにコマンドブロックをつけた実装になっているようである.
参考: http://stackoverflow.com/questions/7681715/whats-the-difference-between-subprocess-popen-and-call-how-can-i-use-them

import subprocess

cmd = 'myprogram myargs'
returncode = subprocess.Popen(cmd)

注意

しかしこれでは,dirやechoなどのWindows built-inコマンドを呼び出すことができない.
呼び出そうとしても,「指定されたファイルは見つかりません」というエラーが帰ってくる.
参考: http://stackoverflow.com/questions/19819417/how-to-use-subprocess-in-windows

解決策は,shell=Trueを付けること.

import subprocess

cmd = 'dir .'
returncode = subprocess.Popen(cmd, shell=True)

先ほどの参考資料にも少しだけ記載があるように,Windowsでshell=Trueを付けると,実際にはコマンドプロンプト cmd.exe が呼び出されて,その上でコマンドが実行される.
このオプションを付けない場合 もしくは shell=Falseとした場合には,拡張子を含めた実際のファイル名を指定しないと呼び出しが発生しない.

さらに注意

多くの人にはたぶん不要であるが,上記の通り,shell=Trueを付けて呼び出されるのはコマンドプロンプトであるため,Powershellの上で実行できる各種のシェルコマンドは,subprocessから呼び出すことはできない.

100
93
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
100
93