例えば、Windowsで
Python
1import subprocess as sp 2 3cmd = "dir" # Linuxの場合は "ls" 4ret = sp.run(cmd, stdout=sp.PIPE, shell=True) 5 6print(ret.stdout.decode("cp932")) # Linuxの場合は "utf-8" または 指定なし
を実行すると
ドライブ C のボリューム ラベルは Windows です ボリューム シリアル番号は A0A0-0123 です C:\Users\user01 のディレクトリ 2021/04/15 (木) 21:13 <DIR> . 2021/04/15 (木) 21:13 <DIR> .. 2020/07/22 (水) 20:28 <DIR> .vscode 2020/11/12 (木) 14:40 <DIR> 3D Objects 2021/03/31 (水) 09:03 <DIR> ansel 2020/08/10 (月) 00:33 <DIR> Apple 2020/11/12 (木) 14:40 <DIR> Contacts 2021/05/02 (日) 12:46 <DIR> Desktop 2020/11/20 (金) 00:03 <DIR> Documents 2020/11/12 (木) 14:40 <DIR> Downloads 2021/01/17 (日) 00:25 <DIR> Favorites 2020/11/12 (木) 14:40 <DIR> Links 2020/11/12 (木) 14:40 <DIR> Music 2021/04/24 (土) 14:09 <DIR> OneDrive 2021/02/04 (木) 09:24 <DIR> Pictures 2020/11/12 (木) 14:40 <DIR> Saved Games 2020/11/12 (木) 14:40 <DIR> Searches 2021/03/31 (水) 14:34 <DIR> share 2021/05/02 (日) 12:44 <DIR> Videos 0 個のファイル 0 バイト 19 個のディレクトリ 306,688,061,440 バイトの空き領域
と出てきます。
shellを指定しない(shell=Falseである)場合、
Traceback (most recent call last): File "c:/Users/user01/Desktop/test.py", line 4, in <module> ret = sp.run(cmd, stdout=sp.PIPE) File "C:\Users\user01\AppData\Local\Programs\Python\Python38\lib\subprocess.py", line 489, in run with Popen(*popenargs, **kwargs) as process: File "C:\Users\user01\AppData\Local\Programs\Python\Python38\lib\subprocess.py", line 854, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, File "C:\Users\user01\AppData\Local\Programs\Python\Python38\lib\subprocess.py", line 1307, in _execute_child hp, ht, pid, tid = _winapi.CreateProcess(executable, args, FileNotFoundError: [WinError 2] 指定されたファイルが見つかりません。
と出てきます。
Linuxだとコマンド文をスペース区切りのリストで引数に指定してあげればいいようです。
例えば、"ls -a" というコマンドを実行するときは、
import subprocess as sp ret = sp.run(["ls", "-a"], stdout=sp.PIPE)
となります。
shell=Falseを指定した場合のメリットってありますか?
普通に使う分にはshell=Trueにすればいいような気がしたのですが、shell=Falseとして実際に使う場面が想像できなかったので。
追記
ドキュメントには下記のように書かれてました。
args はすべての呼び出しに必要で、文字列あるいはプログラム引数のシーケンスでなければなりません。一般に、引数のシーケンスを渡す方が望ましいです。なぜなら、モジュールが必要な引数のエスケープやクオート (例えばファイル名中のスペースを許すこと) の面倒を見ることができるためです。単一の文字列を渡す場合、shell は True でなければなりません (以下を参照)。もしくは、その文字列は引数を指定せずに実行される単なるプログラムの名前でなければなりません。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/05/02 04:46
2021/05/02 05:03