この記事では主にPythonのimport reload __import__との違いを詳しく紹介しますので、必要な方は参考にしてください
import
機能: .pyを含むPythonの標準モジュールをインポート/導入します。ファイル、__init__.py ファイル (カスタム モジュール) のあるディレクトリ。
import module_name[,module1,...] from module import *|child[,child1,...]
注: import ステートメントが複数回再利用される場合、指定されたモジュールは再ロードされませんが、モジュールのメモリ アドレスはローカル変数環境を参照します。
例:
pythontab.py
#!/usr/bin/env python #encoding: utf-8 import os print 'in pythontab',id(os)
test.py
#!/usr/bin/env python #encoding: utf-8 import pythontab #第一次会打印pythontab里面的语句 import os #再次导入os后,其内存地址和pythontab里面的是一样的,因此这里只是对os的本地引用 print 'in c',id(os) import pythontab #第二次不会打印pythontab里面的语句,因为没有重新加载
reload
機能: ロードされたモジュールをリロードします。通常、元のモジュールの変更などの特殊な状況で使用され、モジュールをリロードします以前に輸入されていたはずです。
import os reload(os)
注:
reload はロードされたモジュールを再ロードしますが、元のインスタンスは引き続き古いモジュールを使用し、新しく生成されたインスタンスは再ロード後も新しいモジュールを使用します。アドレスは引き続き使用されます。 ; からはサポートできません。 。輸入。 。フォーマットモジュールがリロードされます。
例:
pythontab.py
#!/usr/bin/env python #encoding: utf-8 import os print 'in pythontab',id(os)
test.py
#!/usr/bin/env python #encoding: utf-8 import pythontab #第一次import会打印pythontab里面的语句 print id(pythontab) #原来pythontab的内存地址 reload(pythontab) #第二次reload还会打印pythontab里面的语句,因为有重新加载 print id(pythontab) #reload后pythontab的内存地址,和原来一样
拡張子:
前述のように、リロード関数は、元のモジュール ファイルが変更されました。他にどのような状況でリロード機能を使用する必要がありますか? 以下に例を示します。
#!/usr/bin/env python #encoding: utf-8 import sys #引用sys模块进来,并不是进行sys的第一次加载 reload(sys) #重新加载sys sys.setdefaultencoding('utf8') ##调用setdefaultencoding函数
上記のコードは正しいので、次のコードをテストしてください
#!/usr/bin/env python #encoding: utf-8 import sys sys.setdefaultencoding('utf8')
上記のテストは失敗します。setdefaultencodingを呼び出すときに、最初にsysモジュールをリロードする必要があるのはなぜですか?ここでのインポート ステートメントは実際には sys の最初のインポート ステートメントではないため、つまり、これは実際には sys モジュールの 2 番目または 3 番目のインポートである可能性があります。これは sys への単なる参照であり、reload によってのみ再ロードできます。では、なぜリロードする必要があるのに、直接参照すると関数を呼び出すことができないのでしょうか? setdefaultencoding 関数はシステムによって呼び出された後に削除されるため、インポートを通じて参照されるときには存在しません。そのため、setdefaultencoding が使用可能になり、インタープリターの現在の文字エンコーディングが使用可能になるように、sys モジュールを一度再ロードする必要があります。コードで変更されました。次のコードを試してみると、同じエラーが報告されます:
#!/usr/bin/env python #encoding: utf-8 import sys reload(sys) sys.setdefaultencoding('utf8') del sys.setdefaultencoding ##删除原来的setdefaultencoding函数 sys.setdefaultencoding('gb2312')
それでは、以前に sys をインポートして setdefaultencoding 関数を呼び出したのは誰でしょうか?答えは、Python インストール ディレクトリの Lib フォルダーに site.py [python2.6] というファイルがあります。その中に main() --> setencoding() -->sys.setdefaultencoding(エンコーディング)、このsite.pyはPythonインタプリタを起動するたびに自動的に読み込まれるため、main関数は毎回実行され、setdefaultencoding関数は出たらすぐに削除されます。
__import__
関数:
import文と同じ関数ですが、__import__は関数でありパラメータとして文字列を受け取るだけなので、その役割は想像できます。実際、インポート ステートメントはインポート作業を実行するためにこの関数を呼び出します。 import sys <==>sys = __import__('sys')
使用法:
__import__(module_name[, globals[, locals[, fromlist]]]) #可选参数默认为globals(),locals(),[] __import__('os') __import__('os',globals(),locals(),['path','pip']) #等价于from os import path, pip
説明:
通常、動的読み込み中に使用されます。この関数は、たとえば、フォルダー内のすべてのモジュールをロードしたいが、その下のモジュール名が頻繁に変更される場合に、この関数を使用してすべてのモジュールを動的にロードできます。最も一般的なシナリオは、プラグイン関数のサポートです。
拡張:
モジュールは文字列を介して動的にインポートできるため、文字列を介してモジュールを動的にリロードすることは可能ですか? reload('os') を試してエラーを直接報告してください。他の方法はありませんか? 直接リロードすることはできませんが、最初にモジュールをアンインポートしてから __import__ を実行してモジュールをリロードすることはできます。次に、unimport 操作がどのように実装されるかを見てみましょう。Python 解釈では、globals()、locals()、vars()、dir() およびその他の関数を通じて、現在の環境にロードされているモジュールとその場所を表示できます。削除できるのは表示のみであるため、インポートを解除することはできません。ただし、sys.modules というモジュールを保存するための別の場所があり、sys.modules を介して、グローバル以外のモジュールも表示できます。 、デフォルトのいくつかの追加モジュールがロードされ、次のステップがアンインポートであることを示します。
概要
以上がPython のインポート、リロード、__import__ の違いの詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。