外部プログラミング実行して結果取得には, 基本 subprocess.run
を使います.
subprocessについてより深く(3系,更新版)
https://qiita.com/HidKamiya/items/e192a55371a2961ca8a4
ありがとうございます.
Python には C 言語での scanf 相当が存在しません. regex で頑張るのも面倒です.
{}
な記述で scanf 的なのができる parse
が便利です.
pip install parse
でぺろっと入ります.
外部プログラム実行と結果取得は以下のような感じです.
import subprocess
import parse
def extract_result(lines):
for line in lines:
print(line.decode("utf-8"))
result = parse.parse("ret = {:g}", line.decode("utf-8"))
if result:
return result[0]
raise RuntimeError("`ret = ...` line not found.")
x = 3.13
ret = subprocess.run("python func.py {}".format(str(x)), shell=True, capture_output=True)
lines = ret.stdout.splitlines()
print(extract_result(lines))
# func.py
import sys
import numpy as np
x = float(sys.argv[1])
print("bora")
print("ret = {}".format(np.sin(x)))
print("dora")
shell=True
はお好みで(False の場合(デフォルトの場合), シェルの機能(e.g. PATH
変数)使えないので /usr/bin/python
などと絶対パス指定が必要)
capture_output
で stdout の結果を取得します.
subprocess の stdout の結果は byte 文字列になっているのでデコードが必要です.
通常は utf-8 かと思います.
Convert bytes to a string
https://stackoverflow.com/questions/606191/convert-bytes-to-a-string
TODO
subprocess.run
で encoding 指定してもよいかもしれません.
Python の subprocess
https://qiita.com/tanabe13f/items/8d5e4e5350d217dec8f5