Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

Soucis de gestion des modules lors d'une conversion python2 - python3

+6 votes

Je suis en train de reprendre une librairie (appelé pyndamics) laissé à l'abandon par son auteur. L'objectif était double : sauver le code source (qui était hebergé sous google code) et tenter de le réécrire pour assurer une compatibilité python2-3.

Le code étant assez simple, pas de soucis pour la conversion, un simple 2to3 donne un code executable par les deux version.

Par contre, lors de l'installation de la lib sur le système via le setup.py, alors que sous python2 la lib roule sans soucis, python3 me fait un joli ImportError.

La structure de la lib :

pyndamics
---- setup.py
---- pyndamics
     ---- __init__.py
     ---- simulation.py

avec le contenu du __init__.py:

from simulation import *
__version__='0.0.1'

Sous python2.7 :

Python 2.7.10 (default, May 26 2015, 04:16:29) 
Type "copyright", "credits" or "license" for more information.

In [1]: import pyndamics

In [2]: 

sous python 3.4 :

Python 3.4.3 (default, Mar 25 2015, 17:13:50) 
Type "copyright", "credits" or "license" for more information.

In [1]: import pyndamics
---------------------------------------------------------------------------
ImportError                               Traceback (most recent call last)
<ipython-input-1-271e3bb08b04> in <module>()
----> 1 import pyndamics

/usr/lib/python3.4/site-packages/pyndamics/__init__.py in <module>()
----> 1 from simulation import *
      2 __version__='0.0.1'

ImportError: No module named 'simulation'

In [2]: 
demandé 30-Jun-2015 par Poisson (272 points)

1 Réponse

+7 votes
 
Meilleure réponse

Le probleme vient du format de l'import relatif du module simulation dans le fichier
pyndamics/pyndamics/__init__.py

python 3 est plus strict que python 2, il faut lui dire explicitement que l'import est relatif en préfixant le nom du module avec un .

# import relatif
from .simulation import *
__version__='0.0.1'

Voire la doc sur les référence au sein du même package : intra-package-references.

répondu 30-Jun-2015 par jc (2,674 points)
sélectionné 30-Jun-2015 par Poisson

La solution marche (et effectivement, c'est l'information qui me manquait quand aux différence d'import python2/3). Le code devrait être bon du coup.

Merci pour l'aide !

N'oubliez pas, afin d'avoir le même comportement d'import en python 2 et 3, vous pouvez faire "from __future__ import absolute_import"

...