web-dev-qa-db-fra.com

Impossible d'importer mes propres modules en Python

J'ai du mal à comprendre comment fonctionne l'importation de modules en Python (je ne l'avais jamais fait auparavant dans une autre langue).

Disons que j'ai:

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

Maintenant j'essaie 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 définitivement quelque chose de mal, car Python ne peut pas voir que myapp est un module:

ImportError: No module named myapp
94
n0pe

Dans votre cas particulier, il semble que vous tentiez d'importer SomeObject à partir des scripts myapp.py et TestCase.py. À partir de myapp.py, faites

import SomeObject

puisque c'est dans le même dossier. Pour TestCase.py, faites

from ..myapp import SomeObject

Cependant, cela ne fonctionnera que si vous importez TestCase à partir du package. Si vous voulez exécuter directement python TestCase.py, vous devez jouer avec votre chemin. Cela peut être fait dans Python:

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

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

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

74
David Robinson

La fonction import recherche les fichiers dans votre env. PYTHONPATH. variable et votre répertoire local. Vous pouvez donc soit placer tous vos fichiers dans le même répertoire, soit exporter le chemin en tapant dans un terminal

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

chemin d'exportation est un bon moyen. Une autre méthode consiste à ajouter un .pth à l’emplacement de votre site-packages . Sur mon Mac, mon python conserve les paquets de sites 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, mettez le chemin suivant référant à mes modules

/opt/awesome/custom_python_modules
9
jmontross

Tu peux essayer

from myapp.myapp import SomeObject

parce que le nom de votre projet est identique à myapp.py, ce qui lui permet de rechercher d'abord le document de projet

4
阿东刘

Dans votre premier répertoire myapp, vous pouvez ajouter un fichier setup.py et ajouter deux codes python dans setup.py.

from setuptools import setup
setup(name='myapp')

dans votre premier répertoire myapp en ligne de commande, utilisez pip install -e. installer le paquet 

Dans mon cas, c’était la surprise de Windows vs Python, bien que les noms de fichiers Windows ne soient pas sensibles à la casse, l’importation Python le est Donc, si vous avez le fichier Stuff.py, vous devez importer ce nom tel quel.

0
astrowalker

pip install sous Windows 10 s'installera par défaut dans 'Program Files/PythonXX/Lib/site-packages', qui est un répertoire qui nécessite des privilèges d'administrateur. J'ai donc résolu mon problème par installation de pip en cours d'exécution en tant qu'administrateur (vous devez ouvrir l'invite de commande en tant qu'administrateur, même si vous êtes connecté avec un compte admin). En outre, il est plus sûr d'appeler pip depuis Python.
par exemple.
python -m pip install <package-name>
au lieu de
pip install <package-name>

0
sziraqui