tapitapi’s blog

1日1杯タピオカ!エンジニア

【python】subprocess run option

PythonでOSコマンド(lsやcdなど)を実行したくてsubprocess.run を使ったので、引数のまとめ

 

公式リファレンス(subprocess.run)

https://docs.python.org/ja/3/library/subprocess.html#subprocess.run

 

使い方の例

(filepath にcd コマンドで移動後、コンソール上にcdコマンドの戻り値を表示する例)

import subprocess 

res =subprocess.run(["cd","filepath"], stdout=subprocess.PIPE)

sys.stdout.buffer.write(res.stdout)

 

引数一覧(=の右辺はデフォルト値)

args, *,(第一引数argsは可変長引数)

stdin=None,

input=None,

stdout=None,

stderr=None,

capture_output=False,

shell=False,

cwd=None,

timeout=None,

check=False,

encoding=None,

errors=None,

text=None,

env=None,

universal_newlines=None

 

下記で一つづつみていきます

 

*args, *,(第一引数argsは可変長引数)

["cd","filepath"] のように、実行したいOSコマンドを記入。

OSコマンド(上記の例ならcd)に渡したい引数は、カンマで区切る。

 

例えば、ls -a -lを実行したいなら、["ls", "-a", "-l"]と記載

 

*stdin

stdin=subprocess.DEVNULL またはstdin=subprocess.PIPEとして実行

標準入力を受け付けるようになる。

 

DEVNULLはヌルデバイスを使いたい時に指定

/dev/null - Wikipedia

 

PIPEは普通の標準入力を使いたい時に指定

 

デフォルトではバイト列として戻り値が返ってくるので注意!

sys.stdin.bufferを使用すること!

 

文字列とバイト列について参考記事

Python3で文字列を処理する際の心掛け - Qiita

 

これはPythonとは関係ないのですが、

標準入力って?パイプって?という場合は下記を参考に。

標準入力、標準出力、標準エラー出力、パイプとは ?

 

*input

標準入力の代わりに、引数で文字列またはバイト列を渡したい時。

input="abc" のように使う。

 

これを使う場合、stdin引数は使用しないこと!!

 

 

*stdout

stdout=subprocess.DEVNULL またはstdout=subprocess.PIPEとして実行

標準出力を取得できるようになる。

sys.stdout.bufferを使用すること!

 

*stderr

標準エラー出力を取得する

 

*capture_output

capture_output=Trueのように、TrueかFalseを指定。(デフォルトはFalseなので、Falseの場合は引数に記載なしでOK)

 

標準出力と標準エラー出力両方とも取得したい場合にTrueにする。

 

capture_output=Trueで、上記のstdout=subprocess.PIPEとstderr=subprocess.PIPEを両方とも指定したのと同じになる。

 

*shell

shell=Trueように、TrueかFalseを指定。(デフォルトはFalseなので、Falseの場合は引数に記載なしでOK)

 

コマンドをシェルに実行させたい場合、True。

 

下記引用

shell が True なら、指定されたコマンドはシェルによって実行されます。あなたが Python を主として (ほとんどのシステムシェル以上の) 強化された制御フローのために使用していて、さらにシェルパイプ、ファイル名ワイルドカード環境変数展開、~ のユーザーホームディレクトリへの展開のような他のシェル機能への簡単なアクセスを望むなら、これは有用かもしれません。しかしながら、Python 自身が多くのシェル的な機能の実装を提供していることに注意してください (特に glob, fnmatch, os.walk(), os.path.expandvars(), os.path.expanduser(), shutil)。

 

*cwd

第一引数のコマンドを実行するパスを指定する。(絶対パスでも相対パスでも可能)

 

cwd=./log など。

cwdを指定しない場合は、subprocess.runの実行されるカレントディレクトリで実行される

 

*timeout

コマンド実行を待つ最大時間を指定(秒)

timeout=15など。

 

try文などで、timeout を超えて実行が終了しない場合の処理を書きたい場合に使用。

 

*check

check=Trueように、TrueかFalseを指定。(デフォルトはFalseなので、Falseの場合は引数に記載なしでOK)

 

引用

check に真を指定した場合、プロセスが非ゼロの終了コードで終了すると CalledProcessError 例外が送出されます。 この例外の属性には、引数、終了コード、標準出力および標準エラー出力が捕捉できた場合に格納されます。

stderr=subprocess.PIPE を指定して、エラーが取得できた場合に例外を出したい時などに使用できそうです。

 

*encoding

標準入出力のバイト列を文字列にデコードするとき、また文字列をバイト列にエンコードするときに使う。encoding=utf-8のように文字コードを指定

 

OSが日本語出力する場合にstderr=subprocess.PIPE を使用する時なども、文字コードを指定しておいた方が無難そうです。

 

*errors

encodingを指定した場合の、エンコーダやデコーダのエラー設定

errors=replace のように、テキストエンコーディングのエラーの設定を指定。

 

エラー設定値については下記参照

codecs --- codec レジストリと基底クラス — Python 3.8.3 ドキュメント

 

 

*text

後述のuniversal_newlinesのエイリアス(別名)。

text=Trueの場合は、stderr=subprocess.PIPE を使用する時など、標準入出力を文字列で操作できるようになる。

 

*env

実行する環境の環境変数ではなく、プログラムに別の環境変数を渡したい場合に使用する。

env={"PATH": "/usr/bin", "KEY":"abcdefg"}のように指定する。

envを指定しない場合は、実行する環境の環境変数が使用できる。しかし、envを指定する場合、プログラムを実行するのに必要な変数すべてを指定する必要あり。

 

 

注意点(引用)

envを指定する場合、プログラムを実行するのに必要な変数すべてをえなければなりません。Windows で Side-by-Side アセンブリ を実行するためには、env は正しい SystemRoot を 含まなければなりません 。

 

*universal_newlines

前述のtextのエイリアス(別名)。

universal_newlines=Trueの場合は、stderr=subprocess.PIPE を使用する時など、標準入出力を文字列で操作できるようになる。

 

 

以上ですーー!!

 

おやすみーーー