C'est la première fois que je m'assois vraiment et que j'essaye python 3 et que je semble échouer lamentablement. J'ai les deux fichiers suivants:
- test.py
- config.py
config.py contient quelques fonctions définies ainsi que quelques variables. Je l'ai réduit à ce qui suit:
config.py
debug = True
test.py
import config
print (config.debug)
J'ai aussi un __init__.py
Cependant, j'obtiens l'erreur suivante:
ModuleNotFoundError: No module named 'config'
Je suis conscient que la convention py3 consiste à utiliser des importations absolues:
from . import config
Cependant, cela conduit à l'erreur suivante:
ImportError: cannot import name 'config'
Je ne sais donc pas quoi faire ici ... Toute aide est grandement appréciée. :)
python
python-3.x
package
python-import
relative-import
Blitzmann
la source
la source
python test.py
, et cela fonctionne parfaitement bien. Je n'ai pas pyCharm, mais c'est peut-être une mauvaise configuration de pyCharm qui cause le problèmeRéponses:
TL; DR: vous ne pouvez pas effectuer d'importations relatives à partir du fichier que vous exécutez car le
__main__
module ne fait pas partie d'un package.Importations absolues - importez quelque chose de disponible sur
sys.path
Importations relatives - importer quelque chose par rapport au module actuel, doit faire partie d'un package
Si vous exécutez les deux variantes exactement de la même manière, l'une d'elles devrait fonctionner. Quoi qu'il en soit, voici un exemple qui devrait vous aider à comprendre ce qui se passe, ajoutons un autre
main.py
fichier avec la structure générale des répertoires comme ceci:Et mettons à jour test.py pour voir ce qui se passe:
Lançons d'abord test.py:
Ici, "test" est le
__main__
module et ne sait rien de l'appartenance à un paquet. Cependant, celaimport config
devrait fonctionner, car leryan
dossier sera ajouté à sys.path.Lançons à la place main.py:
Et ici, le test est à l'intérieur du paquet "ryan" et peut effectuer des importations relatives.
import config
échoue car les importations relatives implicites ne sont pas autorisées dans Python 3.J'espère que cela a aidé.
PS: si vous vous en tenez à Python 3, il n'y a plus besoin de
__init__.py
fichiers.la source
sys.path.append('/some/path/my_module')
intérieur de/some/path/my_module/__init__.py
?sys.path
pendant l'exécution ( github.com / ... ). Vous pouvez également définir la variable d'environnement PYTHONPATH.__init__.py
fichiers." Intéressant. Pouvez-vous élaborer sur ce sujet? J'avais l'impression que le mécanisme de résolution des paquets n'a pas beaucoup changé entre 2 et 3.__init__.py
fichiers." Inversement, pouvez-vous décrire les choses si nous voulons qu'un package fonctionne à la fois en 2 et en 3? Et voir la tristement désuète 2009 À quoi ça sert__init__.py
? et sa réponse la plus votée "Cela fait partie d'un package" . Nous devons commencer à insister sur la distinction «paquet régulier [ancien, pré-3.3]» et «paquet d'espace de noms [3.3+]» partout et souvent.Je l'ai compris. Très frustrant, surtout venant de python2.
Vous devez ajouter un
.
au module, qu'il soit relatif ou absolu ou non.J'ai créé la configuration du répertoire comme suit.
modx.py
mody.py
main.py
quand j'exécute main, c'est ce qui se passe
J'ai couru 2to3, et la sortie principale était la suivante
J'ai dû modifier la déclaration d'importation de mody.py pour le corriger
Ensuite, j'ai exécuté à nouveau main.py et j'ai obtenu la sortie attendue
Enfin, juste pour le nettoyer et le rendre portable entre 2 et 3.
la source
try/except
procédure de chargement est le véritable ingrédient qui fonctionne ici (comme certaines personnes devront utilisertry:scripts.modx
etexcept: modx
), et c'est ce qui a résolu ce problème pour moi.La configuration de PYTHONPATH peut également aider à résoudre ce problème.
Voici comment cela peut être fait sous Windows
set PYTHONPATH=.
la source
Vous devez ajouter le chemin du module à
PYTHONPATH
.Pour UNIX (Linux, OSX, ...)
Pour les fenêtres
la source
J'ai essayé votre exemple
Cela fonctionnera pour moi:
Testé avec Python: 3.4.2 - PyCharm 2016.3.2
A côté de cela PyCharm vous propose d' importer ce nom .
Vous devez cliquer
config
et une icône d'aide apparaît.la source
Vous pouvez simplement ajouter le fichier suivant à votre répertoire de tests, puis python l'exécutera avant les tests
la source
Définissez
PYTHONPATH
la variable d'environnement dans le répertoire racine du projet.Considérant UNIX-like:
la source
Cet exemple fonctionne sur Python 3.6.
Je suggère d'aller
Run -> Edit Configurations
dans PyCharm, de supprimer toutes les entrées et d'essayer à nouveau d'exécuter le code via PyCharm.Si cela ne fonctionne pas, vérifiez votre interpréteur de projet (Paramètres -> Interpréteur de projet) et exécutez les paramètres de configuration par défaut (Exécuter -> Modifier les configurations ...).
la source
Déclarez la liste sys.path correcte avant d'appeler le module:
la source
Comme indiqué dans les commentaires de l'article original, cela semblait être un problème avec l'interpréteur python que j'utilisais pour une raison quelconque, et pas quelque chose de mal avec les scripts python. Je suis passé du bundle WinPython au python 3.6 officiel de python.org et cela a très bien fonctionné. Merci à tous pour l'aide :)
la source
Si vous utilisez python 3+, essayez d'ajouter les lignes ci-dessous
la source
Essayer
Cela permet d'importer à partir du même niveau de dossier. Si vous essayez directement d'importer, cela suppose qu'il s'agit d'un subordonné
la source