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

spiderx_jp @ mac.com spiderx_jp @ mac.com
2006年 12月 23日 (土) 15:06:16 JST


川畑です。

みなさん、ご教示ありがとうございます。
ご教示頂いた、以下の方法で、解決しました。

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


go_calc3('calc.txt', locals())

ちなみに、

def go_calc2(fname, db):
     import os
     if fname and os.path.isfile(fname):
         execfile(fname)

go_calc3('calc.txt', db)

ですと、実行エラーは発生しないのですが、実行後の演算結果(t1,  
t2, t3)が参照できない状況でした。
(わたしの最初の説明が悪くて、すみません)

以上、ご丁寧にご回答頂き、どうもありがとうございます。
助かりました・・・
これからも、どうぞよろしくお願い致します。

川畑

On 2006/12/23, at 11:30, shunuhs wrote:

> 細江です。
>
> 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 mailing list
> Python-ml-jp @ python.jp
> http://www.python.jp/mailman/listinfo/python-ml-jp




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