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
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 :
Phone.Pots
, mais je peux utiliser import Pots
? Ceci est hautement incompatible.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