subprocessを用いてpythonスクリプトを実行したい状況があるとします。引数に、辞書やリストを設定したい場合は、一旦JSON文字列へ変換してから引数として渡します。
下図中の上の行はpythonの辞書型の例です。これを、json.dumps()でJSON形式の文字列へ変換したのが下図中の下の行です。変数やシングルクォーテーションは、ダブルクォーテーションになります。
このJSON文字列を引数として受け取ったサブのpythonスクリプトでは、json.loads()でpythonの辞書やリストへ戻して使用することになります。
▼メインのPythonスクリプトの例
import subprocess
import json
my_dict = {1: 'a', 2: 'b', 3: 'c'}
print('python dict ->', my_dict)
json_dict = json.dumps(my_dict)
print('json dict ->', json_dict)
cmd_list = ['python', 'sub_script.py', json_dict]
try:
result = subprocess.run(
cmd_list,
shell = False,
check = True,
capture_output = True,
text = True,
)
print('Job submitted successfully')
print(result.stdout)
except subprocess.CalledProcessError as e:
print(f'Error submitting job. Exit code: {e.returncode}')
print(f"Output: {e.stdout}")
print(f"Error Output: {e.stderr}")
▼サブのPythonスクリプト例
import sys
import json
json_dict = sys.argv[1]
my_dict = json.loads(json_dict)
for key, val in my_dict.items():
print(key, val)
※使用環境によっては、sys.argvで受け取った文字列が崩れる場合があります。例えば、辞書の要素内のダブルクォーテーションがなかったりです。運悪くそのような状況になった場合はエラー内容を見て自力で、JSON形式の文字列へ変換する必要が生じます。
以上
<広告>
リンク
リンク
リンク