2010-05-26 5 views
3

Quelqu'un de #python a suggéré de rechercher le module "herpaderp" et de trouver tous ceux listés lors de sa recherche. Si c'est le cas, pourquoi ne liste-t-il pas tous les modules de mon système avant de lever ImportError? Quelqu'un peut-il nous éclairer sur ce qui se passe ici?Pourquoi est-ce la sortie de ce programme python?

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 

sortie:

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 
+0

Ce n'est pas sur mon système Windows. Ressemble à une seule question Unix. Êtes-vous capable de trouver ou grep ce module herdaderp quelque part sur votre système de fichiers? Je pense que c'est juste un script stupide. –

+0

@Xavier, ouais je devrais avoir probablement mentionné que herpaderp est une fausse importation ... il n'y a pas de module par ce nom, je testais des crochets d'importation. – amoffat

Répondre

3

On dirait que c'est ce qui se passe:

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

Fondamentalement, le module apport (ne fait pas partie de la lib standard) obtient ligoté dans à un niveau très bas des exceptions, comme, avant que l'exception est écrit à la stdout. Ainsi quand le programme ne trouve pas "herpaderp", il lance une exception et déclenche l'importation de l'apport et de tous les modules qu'il contient et les affiche dans la sortie avant l'exception.

La solution? J'ai supprimé le paquet "python-apport" , ainsi que la suite "ubuntuone-client" qui dépend de . Après la désinstallation, exceptions sont - assez merveilleusement - ne causant pas une seule importation d'un nouveau module ! Maintenant, enfin, je peux continuer en écrivant mon crochet d'importation en paix.

0

Ne pas avoir une bonne réponse à pourquoi cela se passe, mais il diffère entre les deux systèmes d'exploitation je l'ai testé sur.

2.5.1 & 2.6.4 sur 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 sur 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 

Désolé, ce n'est pas vraiment une réponse, mais un peu trop de temps pour aller un commentaire!

+0

Donne un sens :) On dirait que le paquet apport est seulement installé sur les distributions de Linux. Merci d'avoir regardé ça, pycruft. – amoffat

Questions connexes