Ошибка при поиске спецификации для 'fibo.py' (<class 'AttributeError'>: у объекта 'module' нет атрибута '__path__')

У меня есть модуль в файле fibo.py который имеет следующие функции -

#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

Теперь, когда я запускаю модуль из cli python3 как -

> python3 -m fibo.py

Я получаю ошибку

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

Переменная __path__ имеет текущий __path__. Я не уверен, как это исправить.

Ответ 1

Существует два способа запуска Python 3 script.

  • python fibo.py: Аргумент - это имя файла .py. Точки являются частью имени файла.
  • python -m fibo: Аргумент - это имя модуля Python, без .py. Точки указывают пакеты; fibo.py означает "модуль py в пакете fibo."

Это небольшое различие для простого script, подобного вашему. Но для чего-то большего или более сложного он оказывает важное влияние на поведение оператора import:

  • Первая форма приведет к тому, что import будет искать каталог, в котором живет файл .py (и затем поиск в других местах, включая стандартную библиотеку, см. sys.path для полного списка).
  • Вторая форма сделает import поиск в текущем каталоге (а затем и в других местах).

По этой причине в Python 3 требуется вторая форма для большинства установок, которые включают пакеты (а не просто свободные модули в каталоге), поскольку родительский пакет script может не быть импортируемым в первой форме, что может привести к поломке вещей.

Но для простого script, подобного этому, любая форма в порядке.

Ответ 2

В дополнение к ответу Кевина: вы должны добавить путь к своей папке script в переменную среды PYTHONPATH, чтобы она работала на некоторой ОС.

Ответ 3

Это два разных способа запуска скрипта Python 3:

python fibo.py: аргумент - это имя файла .py.

python -m fibo: аргумент - это имя модуля Python без .py