7

コードの場合:

#!/usr/bin/python

src = """
print '!!!'
import os
"""

obj = compile(src, '', 'exec')
eval(obj, {'__builtins__': False})

出力を取得します:

!!!
Traceback (most recent call last):
  File "./test.py", line 9, in <module>
    eval(obj, {'__builtins__': False})
  File "", line 3, in <module>

ImportError: __import__ not found

'print'と'import'はどちらも言語構成です。「eval」が「import」の使用を制限しているのに「print」の使用を制限していないのはなぜですか?

PS私はPython2.6を使用しています

更新:質問は「インポートが機能しないのはなぜですか?」ではありません。しかし、「なぜ印刷が機能するのですか?」アーキテクチャ上の制限などはありますか?

4

4 に答える 4

7

この__import__メソッドは、importキーワード python.orgによって呼び出されます。

モジュールをインポートできるようにする場合は、__import__メソッドをビルトイン に残す必要があります。

src = """
print '!!!'
import os
"""

obj = compile(src, '', 'exec')
eval(obj, {'__builtins__': {'__import__':__builtins__.__import__}})
于 2010-10-16T16:53:23.910 に答える
2

ただし、evalへの呼び出しimportは正常に行われますが、で使用できなくなったビルトインimportのメソッドを使用します。これがあなたが見ている理由です__import__exec

ImportError: __import__ not found

printビルトインに依存しないので、問題なく動作します。

__import__次のようなものを使用して、ビルトインからパスすることができます。

eval(obj, {'__builtins__' : {'__import__' :__builtins__.__import__}})
于 2010-10-16T16:52:19.000 に答える
0

関数呼び出しに指定'exec'したため、印刷は機能します。compile

于 2010-10-16T17:22:32.110 に答える
0

importグローバル/組み込み__import__関数を呼び出します。見つからない場合はimport失敗します。

print作業をグローバルに依存していません。print利用可能なを使用しなくても、この例で機能するのはそのためです__builtins__

于 2010-10-17T20:21:55.733 に答える