2017-04-10 12 views
0

Excelワークブックからコードを読み取って実行します。何らかの理由で、次のコードは実際には評価されません。EvalがExcelのStringと連携していません

import win32com.client 
import os 

excel = win32com.client.DispatchEx('Excel.Application') 
local_dir = os.getcwd() 
book = excel.Workbooks.Open(local_dir+'\\Condition.xlsx', True) 
sheet = book.Sheets('Sheet1') 

condition = sheet.Cells(1,3).Value 

print condition 
print eval(condition) 

excel.Workbooks.Close() 

セルに「1 + 2」が含まれている場合、上記のコードは「3」ではなく「1 + 2」を出力します。 "condition"を "1 + 2"に置き換えると、正しく評価されます。なぜこれがうまくいかないのか?

+2

文字列自体に引用符が含まれていますか?これは問題の可能性があります... 'eval(condition.strip( '"') ' –

+1

あなたのセルには文字列' '1 + 2 ''が含まれていますが、この文字列として評価されます。 ... –

+0

はい、それは問題でした。ありがとうございます!私はevalを使用する以外に何をする必要があるかわかりません。ユーザーが事前定義された形式を持たないロジック式を定義できるようにする必要がありますまたは構造体であり、API呼び出しなどが必要になります。 – PProteus

答えて

0

eval()を使用することはお勧めできません。very dangerous and harmful to your code's securityになる可能性があるためです。

その代わりに、私はあなたがastモジュールからliteral_evalを使用することをお勧め:"1+3"などのような引用符で文字列を処理するために

from ast import literal_eval as eval 
# work to do ... 

をので、あなたのコードに簡単に修正を、あなたはこのような何かを行うことができます。

from ast import literal_eval as eval 
# your actual code 
# ... 
print(eval(condition.replace('"', ''))) 
# Or 
# print(eval(condition.strip('"'))) 

編集:

eval()との違い:

  • eval(my_string_or_input)は:引数のコードが安全であるかどう機能チェック なしで呼び出されるとすぐにコード (文字列/入力/ raw_input)を評価します。
  • literal_eval(my_string_or_input):引数の 文字列/入力/ raw_inputが有効なPythonコードでない場合、例外が発生します。したがって、安全でないコードがある場合、それは実行されません。

詳細については、question/answers in stackoverflowをご確認ください。

+1

evalとast.literal_evalの違いについて説明できますか? – PProteus

+0

私の答えをチェックして、編集しました –

+1

literal_evalは、 Pythonの構文の中では、評価からグローバルおよびローカル辞書を取得することはできません(実際に必要な機能)。 – PProteus

関連する問題