0

SOの長年のブラウザであり、ついに私自身の質問をしました!

そのため、特定の名前の python モジュールをディレクトリから再帰的に検索する自動化スクリプト/モジュールを作成しています。その名前のモジュールが見つかったら、それを動的にロードし、そこから必要なものを取り出してからアンロードします。モジュールを単純に削除しても、そのモジュールへのすべての参照が削除されないことに気付きました。別のものがどこかに残っていて、それがどこにあるのかわかりません。ソースコードをざっと見てみましたが、よくわかりませんでした。これは私が見ているもののサンプルです。大幅に簡略化されています。

Python 3.5.2 (Anaconda v4.2.0) を使用しています。私は importlib を使用していますが、それを使い続けたいと思っています。また、バニラのpython-3でこれを実行できるようにしたいと考えています。

ここのpythonドキュメントからソースからインポートしました(はい、これはPython 3.6ドキュメントであることを認識しています)。

私のメインドライバー...

# main.py
import importlib.util
import sys

def foo():
   spec = importlib.util.spec_from_file_location('a', 'a.py')
   module = importlib.util.module_from_spec(spec)
   spec.loader.exec_module(module)
   print(sys.getrefcount(module))
   del module
   del spec

if __name__ == '__main__':
   foo()
   print('THE END')

そして私のサンプルモジュール...

# a.py
print('hello from a')

class A():
   def __del__(self):
      print('SO LONG A!')

inst = A()

出力:

python main.py
HELLO FROM A!
2
THE END
SO LONG A!

「SO LONG A!」が見られると思っていました。「THE END」の前に印刷。では、私のモジュールへのこの他の隠された参照はどこにあるのでしょうか? 私のデルは、関数にラップされているという事実に無償であることを理解しています。削除とスコープを明示的にしたかっただけです。a.py を完全にアンロードするにはどうすればよいですか? a.py のような大量のモジュールを動的にロードすることを計画していますが、必要以上にそれらを保持したくありません。足りないものはありますか?

4

1 に答える 1