3

#pythonの誰かが、モジュール「herpaderp」を検索し、検索対象としてリストされているすべてのモジュールを検索することを提案しました。この場合、ImportErrorを発生させる前に、システム上のすべてのモジュールを一覧表示しないのはなぜですか?誰かがここで何が起こっているのかを明らかにすることができますか?

import sys

class TempLoader(object):     
    def __init__(self, path_entry):
        if path_entry == 'test': return
        raise ImportError

    def find_module(self, fullname, path=None):
        print fullname, path
        return None

sys.path.insert(0, 'test')
sys.path_hooks.append(TempLoader)
import herpaderp

出力:

16:00:55 $> python wtf.py
herpaderp None
apport None
subprocess None
traceback None
pickle None
struct None
re None
sre_compile None
sre_parse None
sre_constants None
org None
tempfile None
random None
__future__ None
urllib None
string None
socket None
_ssl None
urlparse None
collections None
keyword None
ssl None
textwrap None
base64 None
fnmatch None
glob None
atexit None
xml None
_xmlplus None
copy None
org None
pyexpat None
problem_report None
gzip None
email None
quopri None
uu None
unittest None
ConfigParser None
shutil None
apt None
apt_pkg None
gettext None
locale None
functools None
httplib None
mimetools None
rfc822 None
urllib2 None
hashlib None
_hashlib None
bisect None
Traceback (most recent call last):
  File "wtf.py", line 14, in <module>
    import herpaderp
ImportError: No module named herpaderp
4

3 に答える 3

3

これが起こっているように見えます:

http://rhodesmill.org/brandon/2010/ubuntu-exception-190-modules/

基本的に、apportモジュール(標準ライブラリの一部ではない)は、例外がstdoutに書き込まれる前など、非常に低いレベルで例外に関連付けられます。したがって、プログラムが「herpaderp」の検出に失敗すると、例外がスローされ、apportとそれに含まれるすべてのモジュールのインポートがトリガーされ、例外のに出力に表示されます。

ソリューション?「python-apport」パッケージと、それに依存する「ubuntuone-client」スイートを削除しました。アンインストール後、例外は—素晴らしいことに—新しいモジュールの単一のインポートを引き起こしません!これで、ようやく、インポートフックを安心して書き続けることができます。

于 2010-05-26T22:22:08.370 に答える
0

なぜこれが起こっているのかについては良い答えはありませんが、私がテストした2つのOS間で異なります。

Windowsの2.5.1および2.6.4:

E:\work\python>python wtf.py
herpaderp None
Traceback (most recent call last):
  File "wtf.py", line 14, in <module>
    import herpaderp
ImportError: No module named herpaderp

E:\work\python>python --version
Python 2.5.1

Linuxの2.5.2:

$ python wtf.py
herpaderp None
apport None
subprocess None
... etc etc
_locale None
operator None
shutil None
Traceback (most recent call last):
  File "wtf.py", line 14, in <module>
    import herpaderp
ImportError: No module named herpaderp
$ python --version
Python 2.5.2

申し訳ありませんが、それは実際には答えではありませんが、コメントに入れるには少し長すぎます!

于 2010-05-26T21:51:30.720 に答える
0

これはpupypythonモジュールimhoの一部であり、プロセスインジェクション用です。必要なモジュールをパッケージ化されたメッセージとして提供し、動的にアンパックしてロードできる適切なrpycセッションがないと機能しません。

于 2022-02-03T19:51:29.950 に答える