Почему это вывод этой программы Python? - PullRequest
3 голосов
/ 27 мая 2010

Кто-то из #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

Ответы [ 2 ]

3 голосов
/ 27 мая 2010

Похоже, это то, что происходит:

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

По сути, модуль apport (не являющийся частью стандартной библиотеки) на самом низком уровне привязан к исключениям, например, до того, как исключение будет записано в стандартный вывод. Поэтому, когда программе не удается найти «herpaderp», она выдает исключение и запускает импорт apport и всех содержащихся в нем модулей и отображает их в выводе до исключения.

Решение? Я удалил Пакет «python-apport» вместе с пакет ubuntuone-client, который зависит от этого. После удаления Исключением являются - как ни странно - не вызывает ни одного импорта нового модуль! Теперь, наконец, я могу продолжить пишу мой импортный крюк с миром.

0 голосов
/ 27 мая 2010

У меня нет точного ответа на вопрос, почему это происходит, но между двумя ОС, на которых я его тестировал, они различаются.

2.5.1 и 2.6.4 в Windows:

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

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

Извините, это не совсем ответ, но слишком долго, чтобы комментировать!

...