Question

Python est installé dans un répertoire local.

Mon arborescence de répertoires ressemble à ceci:

(local directory)/site-packages/toolkit/interface.py

Mon code est ici:

(local directory)/site-packages/toolkit/examples/mountain.py

Pour exécuter l'exemple, j'écris python mountain.py et, dans le code, j'ai:

from toolkit.interface import interface

Et j'obtiens l'erreur:

Traceback (most recent call last):
  File "mountain.py", line 28, in ?
    from toolkit.interface import interface
ImportError: No module named toolkit.interface

J'ai déjà vérifié sys.path et le répertoire / site-packages existe. De plus, j'ai le fichier __ init __. Py.bin dans le dossier du toolkit pour indiquer à Python qu'il s'agit d'un paquet. J'ai aussi un __ init __. Py.bin dans le répertoire des exemples.

Je ne sais pas pourquoi Python ne peut pas trouver le fichier quand il se trouve dans sys.path . Des idées? Peut-il s'agir d'un problème d'autorisations? Ai-je besoin d'une autorisation d'exécution?

Était-ce utile?

La solution

Sur la base de vos commentaires sur le post d’orip, je suppose que c’est ce qui s’est passé:

  1. Vous avez modifié __ init __. py sous Windows.
  2. L'éditeur de fenêtres a ajouté quelque chose de non-imprimable, peut-être un retour-chariot (fin de ligne, Windows est CR / LF; sous Unix, c'est seulement LF), ou peut-être un CTRL-Z (fin de ligne). fichier).
  3. Vous avez utilisé WinSCP pour copier le fichier dans votre système Unix.
  4. WinSCP pensait: "Cela a quelque chose qui n'est pas du texte de base; Je vais mettre une extension .bin pour indiquer des données binaires. "
  5. Le manquant __ init __. py (maintenant appelé __ init __. py.bin ) signifie que python ne comprend pas la boîte à outils en tant que package.
  6. Vous créez __ init __. py dans le répertoire approprié et tout fonctionne ...?

Autres conseils

Est-ce que

(local directory)/site-packages/toolkit

avoir un __ init __. py ?

Pour que l'importation parcoure vos répertoires, chaque répertoire doit comporter un fichier __ init __. py .

Sur * nix, assurez-vous également que PYTHONPATH est configuré correctement, en particulier s'il a le format suivant:

 .:/usr/local/lib/python

(Faites attention au .: au début pour qu'il puisse également effectuer une recherche dans le répertoire en cours.)

Il peut également être ailleurs, selon la version:

 .:/usr/lib/python
 .:/usr/lib/python2.6
 .:/usr/lib/python2.7 and etc.

J'ai rencontré quelque chose de très similaire lorsque j'ai fait cet exercice dans LPTHW; Je n'arrivais jamais à faire reconnaître à Python que j'avais des fichiers dans le répertoire d'où j'appelais. Mais j'ai réussi à le faire fonctionner à la fin. Ce que j’ai fait et ce que je recommande, c’est d’essayer ceci:

(REMARQUE: depuis votre post initial, je suppose que vous utilisez une machine basée sur * NIX et que vous exécutez des tâches depuis la ligne de commande. Ce conseil est donc adapté à cela. Depuis que je lance Ubuntu, voici ce que j'ai fait. )

1) Remplacez le répertoire (cd) par le répertoire situé au-dessus du répertoire dans lequel se trouvent vos fichiers. Dans ce cas, vous essayez d'exécuter le fichier mountain.py et d'appeler le module toolkit.interface.py , situés dans des répertoires distincts. Dans ce cas, vous iriez au répertoire contenant les chemins d'accès à ces deux fichiers (ou, en d'autres termes, au répertoire le plus proche partagé par les chemins d'accès de ces deux fichiers). Dans ce cas, le répertoire toolkit .

2) Lorsque vous êtes dans le répertoire a pris , entrez cette ligne de code sur votre ligne de commande:

export PYTHONPATH =.

Ceci définit votre PYTHONPATH sur ".", ce qui signifie que votre PYTHONPATH va maintenant rechercher tous les fichiers appelés dans le répertoire dans lequel vous vous trouvez, (et plus précisément dans le sous-répertoire branches du répertoire dans lequel vous vous trouvez. Ainsi, il ne se contente pas de regarder dans votre répertoire actuel, mais dans tous les répertoires situés dans votre répertoire actuel).

3) Après avoir défini votre PYTHONPATH à l'étape ci-dessus, exécutez votre module à partir de votre répertoire actuel (le répertoire toolkit ). Python devrait maintenant trouver et charger les modules que vous avez spécifiés.

J'espère que ça aide. J'étais assez frustré par cela moi-même.

J'ai résolu mon propre problème et j'écrirai un résumé des erreurs et de la solution:

Le fichier doit être appelé exactement __ init __. py . Si l'extension est différente, comme dans mon cas .py.bin , Python ne peut pas se déplacer dans les répertoires et ne peut pas trouver les modules. Pour modifier les fichiers, vous devez utiliser un éditeur Linux, tel que vi ou nano . Si vous utilisez un éditeur Windows, certains caractères cachés seront écrits.

Un autre problème qui s’exerçait à cet égard est que la racine a installé une autre version de Python. Par conséquent, si vous travaillez avec une installation locale de Python, assurez-vous que l’installation Python qui exécute les programmes est le Python local. Pour vérifier cela, faites juste quel python , et voyez si l'exécutable est celui qui se trouve dans votre répertoire local. Sinon, modifiez le chemin, mais assurez-vous que le répertoire Python local est plus ancien que l'autre Python.

Pour marquer un répertoire en tant que package, vous avez besoin d'un fichier nommé __ init __. py . Est-ce que cela vous aide?

Une solution simple consiste à installer le module à l'aide de python -m pip install < nom-bibliothèque > au lieu de pip install < nom-bibliothèque > . vous pouvez utiliser sudo en cas de restrictions administratives

En utilisant PyCharm (composant de la suite JetBrains), vous devez définir votre répertoire de script en tant que Source:
Clic droit > Marquer le répertoire comme > Racine des sources

Oui. Le répertoire doit contenir le fichier __ init __. Py , qui est le fichier qui initialise le package. Jetez un coup d’œil à this .

  

Les fichiers __init__.py sont nécessaires pour que Python traite les répertoires comme des packages contenant; Ceci est fait pour empêcher les répertoires avec un nom commun, tel que string, de cacher par inadvertance des modules valides apparaissant plus tard sur le chemin de recherche de module. Dans le cas le plus simple, __init__.py peut simplement être un fichier vide, mais il peut également exécuter le code d'initialisation du package ou définir la variable __all__, décrite plus loin.

  1. Vous devez avoir le fichier __ init__.py dans le même répertoire que le fichier que vous importez.
  2. Vous ne pouvez pas essayer d'importer un fichier qui porte le même nom et qui soit un fichier de 2 dossiers configurés sur PYTHONPATH.

par exemple: / etc / environment

PYTHONPATH = $ PYTHONPATH: / opt / folder1: / opt / folder2

/ opt / folder1 / foo

/ opt / folder2 / foo

Et si vous essayez d'importer un fichier foo, python ne saura pas lequel vous voulez.

de foo import ... > > > importerror: pas de module nommé foo

Mes deux cents:

entrer la description de l'image ici

Cracher:

Traceback (most recent call last):
      File "bash\bash.py", line 454, in main
        import bosh
      File "Wrye Bash Launcher.pyw", line 63, in load_module
        mod = imp.load_source(fullname,filename+ext,fp)
      File "bash\bosh.py", line 69, in <module>
        from game.oblivion.RecordGroups import MobWorlds, MobDials, MobICells, \
    ImportError: No module named RecordGroups

Cela a tout gâché en moi - j'ai lu des posts et des posts suggérant de sombres hacks syspath (comme vous voyez mon __ init __. py étaient tous là). Il s'avère que ce jeu / oubli.py et ce jeu / oubli étaient déroutants en python qui crache le module plutôt inutile "Aucun module nommé RecordGroups". Je serais intéressé par une solution de contournement et / ou des liens documentant ce comportement (même nom) - > EDIT (2017.01.24) - consultez Que faire si j'ai un module et un package avec Le même nom? Il est intéressant de noter que les paquets ont normalement priorité, mais apparemment, notre programme de lancement ne respecte pas cette règle.

EDIT (2015.01.17): Je n’ai pas mentionné que nous utilisions un lanceur personnalisé disséqué ici .

Linux: Les modules importés se trouvent dans /usr/local/lib/python2.7/dist-packages

Si vous utilisez un module compilé en C, n'oubliez pas de modifier le fichier .so après sudo setup.py install .

sudo chmod 755 /usr/local/lib/python2.7/dist-packages/*.so

Vous lisez cette réponse qui indique que votre __ init __. py est au bon endroit, que vous avez installé toutes les dépendances et que vous obtenez toujours le ImportError .

Je rencontrais un problème similaire, à l'exception du fait que mon programme s'exécutait correctement sous PyCharm, mais l'erreur ci-dessus se présentait lorsque je l'exécutais depuis le terminal. Après avoir approfondi mes recherches, j'ai découvert que PYTHONPATH n'avait pas l'entrée pour le répertoire du projet. Donc, je règle PYTHONPATH par instruction d'importation qui fonctionne sur PyCharm mais pas à partir du terminal :

export PYTHONPATH=$PYTHONPATH:`pwd`  (OR your project root directory)

Il existe un autre moyen de faire cela en utilisant sys.path en tant que:

import sys
sys.path.insert(0,'<project directory>') OR
sys.path.append('<project directory>')

Vous pouvez utiliser insert / append en fonction de l'ordre dans lequel vous souhaitez que votre projet soit recherché.

Dans mon cas, le problème était que je me connectais à debug python & amp; boost :: Python , ce qui nécessite que l'extension soit FooLib_d.pyd , pas seulement FooLib.pyd ; renommer le fichier ou mettre à jour les propriétés CMakeLists.txt a corrigé l'erreur.

Mon problème était que j'ai ajouté le répertoire contenant le fichier __ init __. py à PYTHONPATH, alors qu'il me fallait en fait ajouter son répertoire parent.

Si vous avez essayé toutes les méthodes décrites ci-dessus mais que vous avez échoué, votre module porte peut-être le même nom en tant que module intégré. Ou bien, un module avec le même nom existant dans un dossier hautement prioritaire dans sys.path par rapport à celui de votre module.

Pour déboguer, dites votre depuis foo.bar import baz plaintes ImportError: aucun module nommé bar . Passer à import foo; print foo , qui montrera le chemin de foo . Est-ce ce que vous attendez?

Si ce n'est pas le cas, renommez foo ou utilisez importations absolues .

Dans mon cas, parce que j'utilise PyCharm et que PyCharm crée un "venv" pour chaque projet du dossier de projet, il ne s'agit que d'un mini env de python. Bien que vous ayez installé les bibliothèques dont vous avez besoin en Python, mais dans votre projet personnalisé 'venv', il n'est pas disponible. C'est la vraie raison de 'ImportError: Aucun module nommé xxxxxx' ne s'est produit dans PyCharm. Pour résoudre ce problème, vous devez ajouter des bibliothèques à votre env personnalisé du projet en procédant comme suit:

  • Dans PyCharm, à partir du menu 'Fichier' - > Paramètres
  • Dans la boîte de dialogue Paramètres, Projet: Interpréteur de projet XXXProject
  • Cliquez sur "Ajouter". bouton, il vous montrera la boîte de dialogue 'Packages disponibles'
  • Recherchez dans votre bibliothèque, cliquez sur "Installer le package"
  • Ensuite, tout le package dont vous aurez besoin sera installé dans le dossier 'venv' personnalisé de votre projet.

 Dialogue de configuration

Profitez.

J'ai résolu le problème en écrivant print (sys.path) et j'ai découvert que python utilisait des paquetages obsolètes malgré une nouvelle installation. La suppression de ces pythons fabriqués utilise automatiquement les bons packages.

À tous ceux qui ont encore ce problème. Je crois que Pycharm se confond avec les importations. Pour moi, quand j'écris 'depuis quelque chose d'importer' depuis un espace de noms, la ligne précédente est soulignée en rouge, indiquant qu'il y a une erreur, mais qu'elle fonctionne. Cependant '' depuis .namespace import quelque chose 'ne sera pas souligné, mais ne fonctionnera pas non plus.

Essayez

try:
    from namespace import something 
except NameError:
    from .namespace import something

Après avoir subi le même problème, j'ai trouvé que ma résolution était de supprimer tous les fichiers pyc de mon projet. Il semble que ces fichiers mis en cache provoquent en quelque sorte cette erreur.

Le moyen le plus simple que j’ai trouvé était de naviguer dans le dossier de mon projet dans l’explorateur Windows et de rechercher *. pyc , puis de sélectionner tout ( Ctrl + A ) et en les supprimant ( Ctrl + X ).

Il est possible que j'aurais pu résoudre mes problèmes en supprimant simplement le fichier pyc spécifique, mais je n'ai jamais essayé cette solution

J'ai rencontré le même problème: Erreur d'importation . De plus, la bibliothèque a été installée à 100% correctement. La source du problème était que sur mon PC 3 versions de python (paquet anaconda) ont été installées). C'est pourquoi la bibliothèque a été installée non au bon endroit. Après cela, je viens de changer la version appropriée de python dans mon IDE PyCharm.

J'ai eu la même erreur. Cela était dû au fait que quelqu'un avait créé un dossier dans le même dossier que mon script, dont le nom était en conflit avec un module que j'importais ailleurs. Au lieu d'importer le module externe, il a regardé à l'intérieur de ce dossier qui ne contenait évidemment pas les modules attendus.

J'ai eu le même problème (Python 2.7 Linux), j'ai trouvé la solution et j'aimerais le partager. Dans mon cas, j'avais la structure ci-dessous:

Booklet
-> __init__.py
-> Booklet.py
-> Question.py
default
-> __init_.py
-> main.py

Dans 'main.py', j'ai essayé sans succès toutes les combinaisons ci-dessous:

from Booklet import Question
from Question import Question
from Booklet.Question import Question
from Booklet.Question import *
import Booklet.Question
# and many othet various combinations ...

La solution était beaucoup plus simple que je ne le pensais. J'ai renommé le dossier "Livret". dans " livret " et c'est tout. Maintenant, Python peut importer la classe Question normalement en utilisant dans 'main.py' le code:

from booklet.Booklet import Booklet
from booklet.Question import Question
from booklet.Question import AnotherClass

À partir de là, je peux conclure que les noms de paquet (dossiers) tels que 'booklet' doivent commencer par des minuscules, sinon Python le confond avec les noms de classe et les noms de fichier.

Apparemment, ce n'était pas votre problème, mais la réponse de John Fouhy est très bonne et ce fil contient presque tout ce qui peut causer ce problème. C’est donc une dernière chose et j’espère que cela pourrait peut-être aider les autres.

Dans mon cas, j’incluais le chemin du dossier package.egg plutôt que le paquet en-dessous. J'ai copié le paquet au plus haut niveau et cela a fonctionné.

Cela a fonctionné pour moi: Création du fichier __ init __. Py dans le dossier parent (dans votre cas, dans le dossier site-packages ). Et importé comme ceci:

from site-packages.toolkit.interface import interface

J'espère que cela vous sera utile également!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top