Python ne trouve pas le module dans le même dossier

98

Mon python ne peut trouver aucun module dans le même répertoire. Qu'est-ce que je fais mal? (python2.7)

J'ai donc un répertoire '2014_07_13_test', avec deux fichiers:

  1. test.py
  2. bonjour.py

où bonjour.py:

# !/usr/local/bin/python
# -*- coding: utf-8 -*-

def hello1():
    print 'HelloWorld!'

et test.py:

# !/usr/local/bin/python
# -*- coding: utf-8 -*-

from hello import hello1

hello1()

Python me donne toujours

>>> Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 4, in <module>
ImportError: No module named hello

Qu'est-ce qui ne va pas?

Philipp_Kats
la source
2
Comment exécutez-vous le script? Aussi quelle est la sortie deimport sys; sys.path
Salem
1
Try>>> import test
martineau
@Casy_fill Exécutez-vous votre programme à partir du répertoire, où se trouvent les fichiers? Pour l'importation, peu importe que les fichiers importés et importés partagent un répertoire. Il est important que votre interpréteur Python ait correctement défini le répertoire courant.
Jan Vlcinsky

Réponses:

80

Votre code est bon, je soupçonne que votre problème est de savoir comment vous le lancez.

Vous devez lancer python à partir de votre répertoire '2014_07_13_test'.

Ouvrez une invite de commande et «cd» dans votre répertoire «2014_07_13_test».

Par exemple:

$ cd /path/to/2014_07_13_test
$ python test.py

Si vous ne pouvez pas «cd» dans le répertoire comme celui-ci, vous pouvez l'ajouter à sys.path

Dans test.py:

import sys, os
sys.path.append('/path/to/2014_07_13_test')

Ou définir / modifier le PYTHONPATH

Et tout devrait aller bien ...

... eh bien il y a une légère erreur avec vos lignes 'shebang' (la première ligne de vos deux fichiers), il ne devrait pas y avoir d'espace entre le '#' et le '!'

Il y a un meilleur shebang que vous devriez utiliser.

De plus, vous n'avez pas besoin de la ligne shebang sur chaque fichier ... seulement ceux que vous avez l'intention d'exécuter depuis votre shell en tant que fichiers exécutables.

Jeremy Allen
la source
merci beaucoup, que la question! Malheureusement, SublimeRepl (que j'utilise) ne prend pas en charge le démarrage de python à partir du dossier pour le moment, il semble donc que je
doive
Les lecteurs ultérieurs s'il vous plaît lire jusqu'au bas de la page pour voir d'autres réponses très utiles, par exemple celle de jfn sur les importations relatives .
HongboZhu
Oui, c'était mon problème. J'avais un gros dossier de projets de pratique Python ouverts dans VS Code et j'avais de gros problèmes pour trouver des choses dans le même répertoire. Mon problème était que, dans le terminal, je n'avais pas changé de répertoire dans le sous-répertoire dans lequel j'avais mon projet actuel. Une fois que j'ai fait cela, le problème était résolu.
Matt West le
105

Modifiez votre importation dans test.py en:

from .hello import hello1
jfn
la source
23
Si quelqu'un d'autre le trouve plus tard, cela s'appelle des importations relatives et a été ajouté dans python 2.5: docs.python.org/2.5/whatsnew/pep-328.html
sgfit
9
Pour importer tout le module, utilisezfrom . import hello
ST7
Je pense que c'est une meilleure solution que la meilleure réponse acceptée. J'utilise l'importation du module entier, comme l'a souligné ST7:from . import local_module
Gene M
25

J'ai eu un problème similaire, je l'ai résolu en ajoutant explicitement le répertoire du fichier à la liste des chemins:

import os
import sys

file_dir = os.path.dirname(__file__)
sys.path.append(file_dir)

Après cela, je n'ai eu aucun problème à importer à partir du même répertoire.

écoteur
la source
2
Bien que cela fonctionne, la réponse de jwn en utilisant les importations relatives était une solution beaucoup plus propre.
Russ Schultz
16

Voici la solution générique que j'utilise. Cela résout le problème d'importation à partir de modules dans le même dossier:

import os.path
import sys
sys.path.append(os.path.join(os.path.dirname(__file__), '..'))

Mettez ceci en haut du module qui donne l'erreur "Aucun module nommé xxxx"

Apadana
la source
1
Cela m'a aidé à charger le module à partir du répertoire parent, en remplaçant ".." par "../ ..". Merci beaucoup!
Nikola R.
1
est le nom de fichier du fichier à importer ou le module actuel où nous importons le module ou il est constant
Manoj
9

Dans mon cas, Python n'a pas pu le trouver car j'avais mis le code dans un module avec des tirets, par exemple my-module. Quand je l'ai changé, cela my_modulea fonctionné.

Chris Claxton
la source
1

J'ai rencontré ce problème. J'avais trois dossiers dans le même répertoire, je devais donc spécifier quel dossier. Ex: depuis le script d'importation de dossier

Nippon87
la source
0

Ce qui suit ne résout pas le problème du PO, mais le titre et l'erreur sont exactement ce à quoi j'ai été confronté.

Si votre projet contient un setup.pyscript, vous pouvez installer le package dans lequel vous vous trouvez, avec python3 -m pip install -e .ou python3 setup.py installou python3 setup.py develop, et ce package sera installé, mais toujours modifiable (les modifications du code seront donc visibles lors de l'importation du package). S'il n'en a pas setup.py, donnez-lui un sens .

Quoi qu'il en soit, le problème auquel OP est confronté ne semble plus exister?

fichier one.py:

def function():
    print("output")

fichier two.py:

#!/usr/bin/env python3

import one
one.function()
chmod +x two.py # To allow execution of the python file
./two.py # Only works if you have a python shebang

Command line output: output

D'autres solutions semblent `` sales ''

Dans le cas d'OP avec 2 fichiers de test, les modifier pour qu'ils fonctionnent est probablement très bien. Cependant, dans d'autres scénarios réels, les méthodes énumérées dans les autres réponses ne sont probablement pas recommandées. Ils vous obligent à modifier le code python ou à restreindre votre flexibilité (exécuter le fichier python à partir d'un répertoire spécifique) et introduisent généralement des ennuis. Et si vous venez de cloner un projet et que cela se produit? Cela fonctionne probablement déjà pour d'autres personnes et il n'est pas nécessaire d'apporter des modifications au code. La réponse choisie veut également que les gens exécutent un script à partir d'un dossier spécifique pour le faire fonctionner. Cela peut être une source de désagrément à long terme, ce qui n'est jamais bon. Il suggère également d'ajouter votre dossier python spécifique à PATH (peut être fait via python ou en ligne de commande). Encore une fois, que se passe-t-il si vous renommez ou déplacez le dossier dans quelques mois? Vous devez à nouveau rechercher cette page, et finalement découvrez que vous devez définir le chemin (et que vous l'avez fait exactement il y a quelques mois), et que vous devez simplement mettre à jour un chemin (vous pouvez certainement utiliser sys.path et le définir par programme, mais cela peut encore être irrégulier ). De nombreuses sources de grande gêne.

Ben Butterworth
la source
0

Si vous êtes sûr que tous les modules, fichiers que vous essayez d'importer sont dans le même dossier et qu'ils doivent être sélectionnés directement en donnant simplement le nom et non le chemin de référence, alors votre éditeur ou terminal doit avoir ouvert le dossier principal où tous les fichiers / modules sont présents.

Soit, essayez d'exécuter à partir du terminal, assurez-vous d'abord d'aller dans le bon répertoire.

CD path to the root folder where all the modules are

python script.py

Ou si vous exécutez [F5] à partir de l'éditeur, c'est-à-dire VsCode, ouvrez le dossier complet et non les fichiers individuels.

Iqra.
la source