openLCA の Python コンソールと olca-ipc の両方で、ユニットプロセスの LCI データを読み出しています。入力はすべてパラメータを使った式で与えています。
画面で開いたプロセスの値は正しい(外部のスプレッドシートと一致する)のに、コードが返す値は違います。データベースを閉じて開き直しても変わりません。
1 件の回答
式を持つ交換では、正しい値は式の側にあります。amount の欄はパラメータの値が変わってもいつも更新されるわけではありません。 スクリプトから読むときは、olca-ipc でも、式を持つ交換の amount をそのまま正しい値とみなさないでください。画面でプロセスを開くと式が解釈され、更新後の値が表示されます。計算でも、すべての式が評価されます(計算設定でのローカル・グローバルパラメータの上書きも含めて)。
amount の欄に式の値が書き込まれるのは、プロセスを変更して保存したときです。グローバルパラメータが変わっただけでは、すべてのプロセスの amount は書き換えません。書き換えるとプロセスが変わったことになり、版や最終更新日時も上げる必要が出て、Collaboration Server とのデータのやり取りなどにも影響しうるためです。
スクリプトで正しい値を得るには、式を自分で評価します。 openLCA の Python エディタでは、式の解釈器(interpreter)を作れます。ローカルパラメータと評価したい式を持つプロセスは、すべて解釈器のスコープとして登録しておく必要があります。次の例は全プロセスを登録し、1つのプロセスの式をそのスコープで評価して表示します(プロセスの ID は例です)。このコードは openLCA 2.0 の頃に示されたもので、ParameterTable.interpreter や db.getDescriptors といった openLCA 内部の API を直接使っています。今の版でも同じ名前のまま動くかは、スレッドでは確かめられていません。
process_ids = set()
for p in db.getDescriptors(Process):
process_ids.add(p.id)
interpreter = ParameterTable.interpreter(db, process_ids, set())
process = db.get(Process, "43ba4a27-a674-4a7c-bc84-b05a431bcb55")
scope = interpreter.getScopeOrGlobal(process.id)
for e in process.exchanges:
if e.formula is not None and e.formula != "":
value = scope.eval(e.formula)
print("%s = %.4f" % (e.formula, value))このコードは openLCA の中の Python エディタ向けです。olca-ipc で同じことをするコードは、スレッドには示されていません。
