2017-02-17 9 views
9

私はhow to check if a python module has been importedを読んでいましたが、指示がはっきりしているようで、sys.modulesのモジュールを確認してください。これは私がPython 2で期待したように動作しますが、Python 3では動作しません(3.5と3.6がテスト済み)。例えば:Python 3で 'sys.modules'にインポートされていないモジュールはなぜですか?

パイソン3.6

>>> import sys 
>>> 'itertools' in sys.modules 
True 

パイソン2.7

>>> import sys 
>>> 'itertools' in sys.modules 
False 

Iは、itertoolsは、Python 3 sys.modules dict<module 'itertools' (built-in)>)の '組み込み' として記載されていることに注意されずPython 2ではおそらくそれがsys.modulesにインポートされているのですが、それはnot listed as a built-inです。とにかく、itertoolsはまだPython 3でインポートする必要があるので、私は説明に感謝したいと思います。

+4

*既にインポートしたモジュールがあれば、自分のモジュールをインポートする必要があります。それらのモジュールは読み込まれたものとして表示されます。多分Python 3にはPython 2には存在しなかった依存関係が導入されていました。モジュールがロードされていても、現在のスコープで使用できるようにするには 'import 'する必要があります。 –

+1

私はあなた自身が質問に答えたと思う:itertoolsが組み込みになった場合、それは通訳の起動時に読み込まれる。 – ForceBru

+0

はなぜ 'itertools'がインポートを必要とするのか、なぜそれがそこにあり、ドキュメントのようにリストされていないのでしょうか? –

答えて

7

にはがインポートされています。インタプリタ起動のどの部分がモジュールをロードさせたのかは重要ではありませんが、必要に応じて可能なパスをトレースできます。例えば、itertoolsfunctoolsによってインポートさreprlib

from itertools import islice 

によってインポートされる:typesによってインポートさ

from reprlib import recursive_repr 

importlibによってインポートさ

import functools as _functools 

import types 

インタープリタの起動時にブートストラップされるのは、ほとんどのインポートの実装があるからです。

+0

偉大な、権威のある答えに感謝します。したがって、インタープリタは 'itertools'(および' os'のような他のモジュール)をインポートしますが、それらを 'globals()'に追加しないのでアクセスできません。 –

+0

@Chris_Rands:これは、インポートのための通常の規則に従います。 'foo'モジュールが' import bar'を実行する場合、そのインポートは 'foo'モジュールの' bar'モジュールのみを利用可能にします。モジュールを使用するすべての人は、それを自分でインポートする必要があります。 – user2357112

+1

だから、 'Py 2'でそれを見つけることができないのは、インポートメカニズムが 'C'で実装されていて、 'itertools'を間接的にインポートしなかったと思います。 –

-1

Python 3に、itertoolsの拡張子が実際にはPython 2とは異なり、メインのPythonバイナリにコンパイルされますが

import sys 

、その後

'itertools' in sys.builtin_module_names 
>> True 

を行う場合は、それが明確であることが表示されます。 Python 2.xコンソールで全く同じ手順を実行すると、結果はFalseになります。

As per the docs'はこのPythonのインタープリタにコンパイルされたモジュール' のbuiltin_module_names含みます。

+0

質問は*なぜ*それだけである。 –

+0

@ JimFasarakis-Hilliard "_whyは、Python 3ではなくPython 2_でインポートされる前にsys.modulesのitertoolsです"という答えは、 "builtin_module_names'での存在によって証明される組み込み関数です。 – Anomitra

+2

モジュールはPythonにコンパイルされますが、 'sys.modules'に表示される前に、それらのモジュールを初期化して読み込みを行う必要があります。 – user2357112

関連する問題