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?
Je ne pensais pas à propos des crochets d'importation. Bien que 'foo.' * * semble * être enregistré dans sys.modules lorsque cet appel' __import__' est fait. –
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. –
Mis à jour. Il ne semble pas que j'ai des hameçons d'importation qui sortent de l'ordinaire. –