web-dev-qa-db-fra.com

python3: ImportError: Aucun module nommé xxxx

Je suis nouveau sur Python et j'essaie de comprendre un problème que je vois lors de la création d'un paquet. J'ai la structure de fichier suivante: (Working-Directory est/my/Python/jmLib2)

/my/Python/jmLib2
     |--- Phone
     |      |--- __init__.py
     |      |--- Pots.py
     |- Test2.py

---------------------------------
cat ./jmLib2/Pots.py
#!/usr/bin/python

def Pots():
    print ("I'm Pots Phone")

---------------------------------
cat ./jmLib2/__init__.py
from Pots import Pots

---------------------------------
cat ./Test2.py
#!/usr/bin/python
from Phone import Pots

import os.path
print ("OS:"+str(os.path))

Pots()

Quand je fais maintenant:

python2 Test2.py
OS:<module 'posixpath' from '/usr/lib/python2.7/posixpath.pyc'>
    I'm Pots Phone*

GRAND ... MAIS, si je le fais:

python3 Test2.py
Traceback (most recent call last):
  File "Test2.py", line 2, in <module>
    from Phone import Pots
  File "/home/juergen/my/Python/jmLib2/Phone/__init__.py", line 1, in <module>
    from Pots import Pots
ImportError: No module named 'Pots'

Je travaille avec PyDev sous Eclipse. PyDev me signale dans le fichier init. Py un erreur "Importation non résolue: pots". J'ai le même problème de retraçage sous PyDev et bash.

Encore une fois, je suis nouveau sur Python ... alors c'est peut-être une erreur très stupide. Mais quelqu'un peut-il m'expliquer, la différence entre python2 et python3.4? Dois-je modifier le PYTHONPATH? Pourquoi?

Salutations Juergen

31
MatrixClient

TL; DR: Les importations relatives ont disparu . Utilisez des importations absolues à la place.

Soit utiliser:

from Phone.Pots import Pots

ou:

from .Pots import Pots

Le problème se produit parce que Pots fait partie du package Phone: il n'y a pas de module nommé Pots, il existe un module nommé Phone.Pots.

Python 2 avait une fonctionnalité appelée importations relatives qui vous permettait d’écrire import Pots même si cela n’était pas techniquement correct.

Les importations relatives sont cependant une source de problèmes et confusion :

  • Qui lit le code ne peut pas dire immédiatement si l'importation provient d'un package ou non.
  • Comment se fait-il que le module s'appelle Phone.Pots, mais je peux utiliser import Pots? Ceci est hautement incompatible.
  • Que se passe-t-il si le sous-module masque le nom d'un autre module?

Pour ces raisons, les importations relatives ont été supprimées de Python 3.


Vous pouvez supprimer les importations relatives de Python 2 en utilisant un __future__ import :

from __future__ import absolute_import
45
Andrea Corbellini