web-dev-qa-db-fra.com

Erreur lors de la recherche de la spécification 'fibo.py' (<class 'AttributeError'>: l'objet 'module' n'a pas d'attribut '__path__')

J'ai un module dans un fichier fibo.py qui a les fonctions suivantes - 

#fibonacci numbers module

def fib(n):    # write Fibonacci series up to n
    a, b = 0, 1
    while b < n:
        print(b, end=' ')
        a, b = b, a+b
    print()

def fib2(n): # return Fibonacci series up to n
    result = []
    a, b = 0, 1
    while b < n:
        result.append(b)
        a, b = b, a+b
    return result

Maintenant, quand je lance le module à partir du cli python3 en tant que - 

> python3 -m fibo.py

Je reçois l'erreur 

Error while finding spec for 'fibo.py' (<class 'AttributeError'>:
'module' object has no attribute '__path__')

La variable __path__ a le dir actuel. Je ne sais pas comment résoudre ce problème.

11
Eternal Learner

Vous pouvez exécuter un script Python 3 de deux manières.

  1. python fibo.py: l'argument est le nom du fichier .py. Les points font partie du nom de fichier.
  2. python -m fibo: l'argument est le nom d'un module Python, sans .py. Les points indiquent les paquets; fibo.py signifie "le module py dans le paquetage fibo."

Ceci est une petite distinction pour un script simple comme le vôtre. Mais pour quelque chose de plus grand ou de plus complexe, cela a un effet important sur le comportement de la déclaration import:

  1. Le premier formulaire fera en sorte que import cherche dans le répertoire où réside le fichier .py (puis dans divers autres endroits, y compris la bibliothèque standard; voir sys.path pour une liste complète).
  2. Le second formulaire fera que import fouille le répertoire current (et divers autres endroits).

Pour cette raison, sous Python 3, le second formulaire est requis pour la plupart des configurations impliquant des packages (plutôt que des modules vides dans un répertoire), car le package parent du script peut ne pas être importable sous le premier formulaire, ce qui peut entraîner des problèmes. casser.

Mais pour un script simple comme celui-ci, l'une ou l'autre forme convient.

54
Kevin

En plus de la réponse de Kevin: vous devez ajouter un chemin d'accès à votre dossier de script à la variable d'environnement PYTHONPATH pour le faire fonctionner sous un système d'exploitation.

0
Fyodor Kutsepin