解決法
「AttributeError: partially initialized module '❓❓❓'」
- 上記の「❓❓❓」の部分のモジュールと同名のファイルがないか確認
- あれば(というかあるからエラー)、同名のファイルの名前を変更
例えば僕の場合は、
import subprocess
を実行するとエラーが起きたので、、
「Me/subprocess.py
」を「Me/subprocess2.py
」へ名前変更
Me/
├ sample.py
├ subprocess.py ← 「subprocess2.py」などに変更
Python/
├ Libs/
├ subprocess.py
すると正規のモジュール「Python/Libs/subprocess.py
」が読み込まれます。
原因
単にファイル名がダブっていたことで、自作の非正規なsubprocess.py
が優先して読み込まれていただけでした。
ちなみにエラーの全文は
AttributeError: partially initialized module 'subprocess' has no attribute 'run' (most likely due to a circular import)
ですが、Me/subprocess.py
内でrun関数を定義してしまっていたら更に沼っていたと思います。うっかり😜
予想
モジュール(なんとか.py)のimportって
同ディレクトリ > その他ディレクトリ
の順で読み込まれるんですかね。
DLLプランティングと同じ要領で、
標準モジュール.pyと同名のファイルを優先度の高い隠しディレクトリにインストールする、、
みたいなマルウェアがあると厄介ですね。
DLLプランティングとは?
exeファイルは実行される際、DLLファイルを参照することがあります。
このとき、読み込むDLLの優先度はカレントディレクトリ(exeがあるディレクトリ) > システムフォルダ等
となります。
カレントディレクトリに正規のDLLが存在しない時、攻撃者はカレントディレクトリに本来読み込むべきDLLと同名のDLLファイルを配置します。
するとexeは優先度に従い、攻撃者が配置したDLLファイルを読み込みます。悪意あるコードが実行されてしまうということです。