ホームページ > バックエンド開発 > Python チュートリアル > Python での import reload __import__ の使用法の違いを比較する

Python での import reload __import__ の使用法の違いを比較する

巴扎黑
リリース: 2017-09-19 10:45:10
オリジナル
1874 人が閲覧しました

import

機能: .py ファイルと __init__.py ファイル (カスタム モジュール) を含むディレクトリを含む Python 標準モジュールをインポート/導入します。

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 ステートメントはこの関数を呼び出してインポート作業を実行します。 import sys <==>sys = __import__('sys')

Use:

__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 reload __import__ の使用法の違いを比較するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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