Python 学習:import 取り消し?

2014-05-23 :  PCクリニック
本文の前に、
-・・・ -・-
blogram「最新エントリのエコー」は、
昨日記事分、夕方になって反映した。結局、20、21日分は不明のまま。
現時点での、blogramのランクインカテゴリは、
3、2、2、1、0、 0、0、0、1、0(39)で、換算ポイント 63pt 。
特段のランク変動は無し?
・-・ - -・

さて、本文。

先月初め(2014-04-04)に、
Python 学習:import 機能
を書いた。

ところで、一旦 import したものを取り消すことは出来ないの???

調べてみた。
例の「Stack Overflow」にあった。[duplicate]と成っているが、
Remove an imported python module
  ・・・・・
  Why do you need to do that?
で、回答には、
  Unloading a module from Python is not supported.
無いと云うこと。

もう一つ、「Stack Overflow」にある。
Unload a module in Python
  ・・・・・
最初の回答には、
  Python does not support unloading modules.
と同じ文言。
続いて、
  However,
  unless your program loads an unlimited number of modules over time,
  that's not the source of your memory leak.
  Modules are normally loaded once at start up and that's it.
  Your memory leak most likely lies elsewhere.
この機械翻訳は:
  しかし、
  あなたのプログラムのモジュールの数に制限時間をかけて読み込みしない限り、
  それはメモリ リークのソースです。
  モジュール通常一度だけ読み込まれる開始時、それは。
  メモリ リーク可能性が最も高いは別の場所にあります。
と訳が分からない。

まあ、(機械翻訳は)こんなもの。

このQ&Aには、
いろいろと、解説があるが、・・・・・
良く理解できない(汗;

やはり、日本語がイイ。
「ctrlshiftの日記」の 2010-03-17 の記事:
Pythonでモジュールをアンインポートする方法
が詳しい!
  ・・・・・
  問題の検証
  例えば、以下のような2種類のスクリプトを用意しましょう。
  以下のスクリプトは「Test.py」というタイトルのファイル。
  このファイルは「A」というフォルダと、
  「B」というフォルダの2つに入れておきましょう。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

def print_path():
print(__file__)


  以下のスクリプトは「Load.py」という名前のファイル。
  「./A/Test.py」を読み込んで、print_path関数を実行し、
  「./B /Test.py」を読み込んで、print_path関数を実行します。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys

sys.path.append('./A')
import Test
Test.print_path()
sys.path.remove('./A')

sys.path.append('./B')
import Test
Test.print_path()
sys.path.remove('./B')


  「sys.path」にモジュールのあるディレクトリを加えたあとに、
  「import」することで必要なファイルを使うことができます。
  このファイルを実行すると、以下のように出力されます。
  ・・・・・

やってみた。
その通り!

で、
  アンインポートの解決策
  ・・・・・
  以下のスクリプトがアンインポート機能の実装です。
  ・・・・・

これも、その通り!

  sys.modules.pop('Test')  # Unimport module forcely

が“ミソ”ですね。

これで、一件落着。


だが、まてよ。
Python recipe
には、無いの???

Reloading all modules - recipes:81731
があった。
この“レシピ”は、「import」した全てを対象にしている。

  Reloading all modules (Python recipe)
  ・・・・・
  ・・・・・
  You can use the reload() function
  but this is quite difficult if you do changes in a module
  wich isn't directly imported by your test script.

  A good solution could be to remove all modules from memory
  before running the test script.
  You only have to put some few lines at the start of your test script.

  # solution1 :  ==========================
  # solution2 :  ==========================

  If you work with a tool like IDLE, you will notice that solution 1 fail.
  This is because sys.modules.clear() remove IDLE from memory,
  so you will have to use solution 2 in that case.

このQ&A、若干目的が異なる。
だが、参考にはなる。
「解決策1」は単純だが問題有り。
IDEを使っているときは「解決策2」が必要?


ところで、このQ&Aは「reload()」の話しがメイン。

この「reload()」については、
Python 学習:import 機能
で参照したサイトのタイトルにあった。

初めてのPython(5) importとfromとreloadでモジュールを使いこなす
これには、
  ・・・・・
  reload
  個人的に面白い使い方が出来そうと思ったのが“reload”です。
  名前の通り、モジュールを再読み込みします。
    先ほど、
  importは“1度目の呼び出し時だけオブジェクトを生成する”と説明しました。
  これは、“1度目の呼び出し時だけ
  ソースコードをコンパイルしてオブジェクト化する”ことを示します。
  つまり、ソースコードはimportを使う限り、1度だけしか読み込まれないんです。
    これを2度、3度と読み込むのが“reload”です。
  ・・・・・

そうすると、最初の日本語サイトの解決策は、

# -*- coding: utf-8 -*-

import sys

sys.path.append( './A' )
import Test
Test.print_path()
### sys.modules.pop('Test') # これの代わりに下記を
sys.path.remove( './A' )

sys.path.append( './B' )
reload ( Test ) # 上記の代わりにこれ。
Test.print_path()
sys.path.remove( './B' )


とすることでも良いですね。


本日はここまで。

Python 学習は続く、・・・


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒ blogram投票ボタン


140511,22
関連記事
スポンサーサイト

コメントの投稿

管理者にだけ表示を許可する

おきてがみ/blogram
blogram投票ボタン



おきてがみ

最新記事
カレンダー
07 | 2017/08 | 09
- - 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31 - -
月別アーカイブ
カテゴリ
最新コメント
検索フォーム
リンク
プロフィール

<紙>

Author:<紙>
ようこそ。
「パソコンヲタクの雑記帳」
もろもろなことを綴っています。
パソコン ヲタクってねくら?
画像は kami でなく kani です。

カウンター(fc2、i2i) /Google Analytics


i2i(from 2010-08-24)
Total =
Today  =  
Yesterday=
アンチエイジング

Google Analytics
ブックマーク