2010-06-10 18 views
4

J'ai un paquet nommé jiva_tasks, que je suis en train d'importer via le céleri (en utilisant l'attribut CELERY_IMPORTS de celeryconfig La déclaration d'importation que le céleri utilise est la suivante:Est-ce que cette fonctionnalité __import__ est correcte? .

__import__(module, [], [], ['']) 

Étrangement, lorsque cette syntaxe est utilisé, le module est importé deux fois, une fois comme jiva_tasks et une autre fois comme jiva_tasks. (avec une période à la fin.) Maintenant, il y a de bonnes chances que le céleri doive passer en globals plutôt qu'une liste vide, mais cela semble Il me semble étrange que même si les arguments sont faux, __import__ chose qui n'est pas un nom de module python valide.

Je sais que la façon de résoudre ce problème est de passer en globals, mais je veux comprendre pourquoi je reçois ce résultat. Est-ce un bug ou y a-t-il quelque chose que je ne comprends pas sur le fonctionnement de __import__?

Mise à jour: Il semble également fonctionner correctement si j'utilise importlib.

Mise à jour 2: Voici le sys.meta_path et sys.import_path juste avant la ligne __import__ est exécuté:

>>> sys.meta_path 
[] 
>>> sys.path_hooks 
[<type 'zipimport.zipimporter'>] 

Il ne me semble pas qu'il n'y ait rien hors de l'ordinaire. Cependant, je viens de réaliser que le paquet que j'importe est installé en utilisant la commande develop de setuptools. Cela fait-il une différence?

Répondre

1

Création d'un fichier vide « foo.py » et puis en créant un « bar.py » qui dit:

__import__('foo', [], [], ['']) 
import sys 
print sorted(sys.modules) 

imprime une liste qui ne comprend que foo une fois, et non foo. ou quoi que ce soit d'autre avec un point de fuite - donc ce n'est pas simplement le fait que le céleri utilise __import__ qui cause le problème ici. Pouvez-vous comprendre quelle étape supplémentaire de céleri prend qui ajoute le deuxième module? (Ou fait un print sorted(sys.modules) juste avant et après l'appel __import__() suggèrent que les deux modules apparaissent à ce moment-là - auquel cas nous devons regarder quels crochets d'importation sont définis au moment de l'importation?)

+0

Je ne pensais pas à propos des crochets d'importation. Bien que 'foo.' * * semble * être enregistré dans sys.modules lorsque cet appel' __import__' est fait. –

+0

Si le '__import __()' ajoute 'foo.' alors regardons les crochets d'importation! Ajoutez à votre question la sortie de l'impression 'sys.metapath' et' sys.path_hooks' et, si vous en trouvez, essayez de partager leur code avec nous. –

+0

Mis à jour. Il ne semble pas que j'ai des hameçons d'importation qui sortent de l'ordinaire. –