为什么这是这个python程序的输出?

为什么这是这个python程序的输出?,python,import,module,hook,sys,Python,Import,Module,Hook,Sys,来自#python的人建议它正在搜索模块“herpaderp”,并找到所有列为其搜索的模块。如果是这样的话,为什么它不列出我系统中的每个模块,然后再引发问题呢?有人能解释一下这里发生了什么吗 import sys class TempLoader(object): def __init__(self, path_entry): if path_entry == 'test': return raise ImportError def

来自#python的人建议它正在搜索模块“herpaderp”,并找到所有列为其搜索的模块。如果是这样的话,为什么它不列出我系统中的每个模块,然后再引发问题呢?有人能解释一下这里发生了什么吗

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
16:00:55$>python wtf.py
赫尔帕德普诺
一点也不
子进程无
无回溯
不泡菜
结构无
没有
sre_编译无
sre_解析无
sre_常数无
无组织
临时文件无
随机无
__未来无
urllib无
无字符串
无插座
_ssl无
URL解析无
收藏无
关键字无
ssl无
文本包装无
base64无
不匹配
全球无
无退出
xml无
_xmlplus无
不复制
无组织
派克无
问题报告无
gzip无
无电子邮件
库普里无
无
无单元测试
ConfigParser无
舒蒂尔无
无
apt_包装无
gettext None
地区无
功能工具无
httplib无
美托尔无
rfc822无
urllib2无
hashlib无
_hashlib无
一分为二
回溯(最近一次呼叫最后一次):
文件“wtf.py”,第14行,在
导入herpaderp
ImportError:没有名为herpaderp的模块

对于为什么会发生这种情况,我没有一个好的答案,但我测试的两个操作系统之间有差异

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
E:\work\python>python wtf.py
赫尔帕德普诺
回溯(最近一次呼叫最后一次):
文件“wtf.py”,第14行,在
导入herpaderp
ImportError:没有名为herpaderp的模块
E:\work\python>python--version
Python 2.5.1
2.5.2在Linux上:

$ 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
$python wtf.py
赫尔帕德普诺
一点也不
子进程无
... 等等
_地区无
操作员无
舒蒂尔无
回溯(最近一次呼叫最后一次):
文件“wtf.py”,第14行,在
导入herpaderp
ImportError:没有名为herpaderp的模块
$python—版本
Python 2.5.2

对不起,这不是一个真正的答案,但有点太长了,在评论

看起来事情就是这样的:

基本上,apport模块(不是标准库的一部分)在非常低的级别上与异常绑定,比如,在将异常写入标准输出之前。因此,当程序无法找到“herpaderp”时,它会抛出一个异常并触发apport及其包含的所有模块的导入,并在异常发生前的输出中显示它们

解决方案是什么?我已经移除了 “python apport”包,以及 “ubuntuone客户端”套件 这取决于它。卸载后, 例外情况是——非常好- 不会导致一次导入新的 模块!现在,我终于可以继续了 平静地写我的文章


它不在我的Windows系统上。看起来像是唯一的问题。您是否能够在文件系统的某个位置找到或grep此herdaderp模块?我认为这只是一个愚蠢的脚本。@Xavier,是的,我应该提到herpaderp是一个伪造的导入…没有这个名字的模块,我正在测试导入挂钩。有意义:)看起来apport包只安装在linux发行版上。谢谢你的调查,皮克鲁夫特。