[Python-ml-jp 3829] Re: インタプリタ上の変数値を利用した外部コードの実行

shunuhs shunuhs.jp @ gmail.com
2006年 12月 23日 (土) 11:30:13 JST


細江です。

go_calc()の名前空間にdbがないためにエラーになっているので、
下記のように、引数でdbを渡してやったら動作します。

ipythonでは試してませんが。

=== mycalc.pyの内容 ===
- def go_calc(fname):
+ def go_calc(fname, db):
      import os
      if fname and os.path.isfile(fname):
          execfile(fname)

=== 実行内容 ===
class MyDB: pass
   ...:
db = MyDB()
db.t0 = 3.0e-9
from mycalc import *
go_calc('calc.txt', db)

ただし、これだとdb以外の変数を渡したい時に汎用性がないので
下記のようにしたら良いのではないでしょうか。

def go_calc(fname, env):
  import os
  if fname and os.path.isfile(fname):
    execfile(fname, {}, env)

>>> class MyDB: pass
...
>>> db = MyDB()
>>> db.t0 = 3.0e-9
>>> import mycalc
>>> mycalc.go_calc('calc.txt', locals())

これでいかがでしょうか。


06/12/23 に 川畑 賢一<spiderx_jp @ mac.com> さんは書きました:
> はじめまして、川畑と申します。
> まだ、Pythonを始めて日が浅いのですが、どうぞよろしくお願い
> いたします。
>
> 早速ですが、インタプリタ(ipython)上で定義した変数内容を
> 外部ファイル("calc.txt")で定義した演算式に基づいて計算を
> させるようなことを実現したいと思っております。
>
> ipython上で以下のコードは、正常に動作し、"calc.txt"で定義
> した計算式結果が正しく得られることが確認できました。
>
> === ipythonでの実行内容 ===
>
> In [1]: class MyDB: pass
>     ...:
>
> In [2]: db = MyDB()
>
> In [3]: db.t0 = 3.0e-9
>
> In [4]: execfile('calc.txt')
>
> In [5]: t1
> Out[5]: 4.0000000000000002e-09
>
> In [6]: t2
> Out[6]: 5.0000000000000001e-09
>
> In [7]: t3
> Out[7]: 9.0000000000000012e-09
>
> === calc.txtの内容 ===
> t1=1e-9+db.t0
> t2=2e-9+db.t0
> t3 = t1 + t2
>
> そこで、execfile()の実行を外部関数として定義しようと思い、
> 以下のような"mycalc.py"というファイルを作成&インポート、
> 関数"go_calc"を実行したところ、構文エラーとなってしまいま
> した。
>
> === mycalc.pyの内容 ===
> def go_calc(fname):
>      import os
>      if fname and os.path.isfile(fname):
>          execfile(fname)
>
> === ipythonでの実行内容 ===
> In [1]: class MyDB: pass
>     ...:
>
> In [2]: db = MyDB()
>
> In [3]: db.t0 = 3.0e-9
>
> In [4]: from mycalc import *
>
> In [5]: go_calc('calc.txt')
> ------------------------------------------------------------------------
> ---
> <type 'exceptions.NameError'>             Traceback (most recent call
> last)
>
> /Users/kawabata/Develop/samples/python/<ipython console> in <module>()
>
> /Users/kawabata/Develop/samples/python/mycalc.py in go_calc(fname)
>        1 def go_calc(fname):
>        2         import os
>        3         if fname and os.path.isfile(fname):
> ----> 4                 execfile(fname)
>
> /Users/kawabata/Develop/samples/python/calc.txt in <module>()
> ----> 1 t1=1e-9+db.t0
>        2 t2=2e-9+db.t0
>        3 t3 = t1 + t2
>
> <type 'exceptions.NameError'>: name 'db' is not defined
>
>
> おそらく、名前空間の問題だと思い、いろいろ試してみましたがなかな
> か解決に至らず、質問させて頂きました。
> 解決または、実現方法をご存知の方、いらっしゃいませんでしょうか?
> 是非、ご教示頂きたく。
> どうぞよろしくお願い致します。
>
> 川畑
>
>
> _______________________________________________
> Python-ml-jp mailing list
> Python-ml-jp @ python.jp
> http://www.python.jp/mailman/listinfo/python-ml-jp
>



Python-ml-jp メーリングリストの案内