206 votes

Je ne peux pas importer mes propres modules dans Python

J'ai du mal à comprendre comment fonctionne l'importation de modules en Python (je ne l'ai jamais fait non plus dans un autre langage).

Disons que je l'ai fait :

myapp/__init__.py
myapp/myapp/myapp.py
myapp/myapp/SomeObject.py
myapp/tests/TestCase.py

J'essaie maintenant d'obtenir quelque chose comme ça :

myapp.py
===================
from myapp import SomeObject
# stuff ...

TestCase.py
===================
from myapp import SomeObject
# some tests on SomeObject

Cependant, je fais certainement quelque chose de mal car Python ne peut pas voir que myapp est un module :

ImportError: No module named myapp

4 votes

Si les réponses à cette question expliquent comment résoudre le problème, la raison est expliquée ici : stackoverflow.com/questions/24435697/

142voto

David Robinson Points 33371

Dans votre cas particulier, il semble que vous essayez d'importer SomeObject des scripts. Dans myapp.py, faites

import SomeObject

puisqu'il se trouve dans le même dossier. Pour TestCase.py, faites

from ..myapp import SomeObject

Cependant mais cela ne fonctionnera que si vous importez le TestCase à partir du paquet. Si vous souhaitez exécuter directement python TestCase.py Il faudrait alors modifier la trajectoire. Cela peut être fait avec Python :

import sys
sys.path.append("..")
from myapp import SomeObject

bien que cela ne soit généralement pas recommandé.

En général, si vous voulez que d'autres personnes utilisent votre paquetage Python, vous devez utiliser distutils pour créer un setup script. De cette façon, n'importe qui peut installer votre paquetage facilement en utilisant une commande comme python setup.py install et il sera disponible partout sur leur machine. Si vous êtes sérieux au sujet du paquet, vous pouvez même l'ajouter à l'index des paquets Python, PyPI .

56voto

Zenon Points 682

La fonction import recherche des fichiers dans la variable d'environnement PYTHONPATH et dans votre répertoire local. Vous pouvez donc soit mettre tous vos fichiers dans le même répertoire, soit exporter le chemin d'accès dans un terminal: :

export PYTHONPATH="$PYTHONPATH:/path_to_myapp/myapp/myapp/"

3 votes

Comment puis-je alors m'assurer qu'il fonctionne pour toutes les autres personnes qui l'utiliseront ? Je préférerais ne pas avoir à leur dire de définir certaines variables d'environnement avant de l'exécuter.

1 votes

Le répertoire courant est dans pythonpath, donc tant que les scripts sont dans le même dossier/répertoire cela devrait fonctionner. malheureusement chacun de ces scripts sont dans des répertoires séparés.

5 votes

Pour les utilisateurs de Windows, au lieu de export nous avons "set PYTHONPATH=%PYTHONPATH% ; C:\path_to_myapp\myapp\myapp\ "

15voto

阿东刘 Points 109

Vous pouvez essayer

from myapp.myapp import SomeObject

parce que le nom de votre projet est le même que celui de myapp.py, ce qui fait qu'il cherche d'abord dans le document du projet.

14voto

jmontross Points 1882

Le chemin d'exportation est un bon moyen. Une autre façon est d'ajouter un .pth à l'emplacement de votre site-packages. Sur mon Mac, mon python conserve les site-packages dans /Library/Python comme indiqué ci-dessous

/Library/Python/2.7/site-packages

J'ai créé un fichier appelé awesome.pth dans /Library/Python/2.7/site-packages/awesome.pth et dans le fichier j'ai mis le chemin suivant qui fait référence à mes modules awesome

/opt/awesome/custom_python_modules

1 votes

Dans le cas où je travaille sous Windows, comment faire ?

0 votes

Je n'en suis pas certain. Dans le cas où vous utilisez Windows. Trouvez un logiciel vm et utilisez linux. Ou bien, consultez cette réponse sur l'exportation de variables sous Windows. stackoverflow.com/questions/559816/

0 votes

C'est exactement ce dont j'avais besoin

12voto

Krysalead Points 21

Vous devez avoir

__init__.py

dans tous les dossiers contenant du code avec lequel vous devez interagir. Vous devez également spécifier le nom du dossier supérieur de votre projet dans chaque importation, même si le fichier que vous avez essayé d'importer se trouve au même niveau.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X