ホームページ > バックエンド開発 > Python チュートリアル > Python のインポート、リロード、__import__ の違いの詳細な説明

Python のインポート、リロード、__import__ の違いの詳細な説明

黄舟
リリース: 2017-10-16 11:04:24
オリジナル
1569 人が閲覧しました

この記事では主に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__(&#39;os&#39;)  
__import__(&#39;os&#39;,globals(),locals(),[&#39;path&#39;,&#39;pip&#39;]) #等价于from os import path, pip
ログイン後にコピー

説明:

通常、動的読み込み中に使用されます。この関数は、たとえば、フォルダー内のすべてのモジュールをロードしたいが、その下のモジュール名が頻繁に変更される場合に、この関数を使用してすべてのモジュールを動的にロードできます。最も一般的なシナリオは、プラグイン関数のサポートです。

拡張:

モジュールは文字列を介して動的にインポートできるため、文字列を介してモジュールを動的にリロードすることは可能ですか? reload('os') を試してエラーを直接報告してください。他の方法はありませんか? 直接リロードすることはできませんが、最初にモジュールをアンインポートしてから __import__ を実行してモジュールをリロードすることはできます。次に、unimport 操作がどのように実装されるかを見てみましょう。Python 解釈では、globals()、locals()、vars()、dir() およびその他の関数を通じて、現在の環境にロードされているモジュールとその場所を表示できます。削除できるのは表示のみであるため、インポートを解除することはできません。ただし、sys.modules というモジュールを保存するための別の場所があり、sys.modules を介して、グローバル以外のモジュールも表示できます。 、デフォルトのいくつかの追加モジュールがロードされ、次のステップがアンインポートであることを示します。


りー

概要

以上がPython のインポート、リロード、__import__ の違いの詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート