Error while finding spec for 'fibo.py" (: "module" obiekt nie posiada atrybutu " path ")

Mam moduł w pliku fibo.py, który ma następujące funkcje -

#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

Teraz kiedy uruchamiam moduł z cli python3 jako -

> python3 -m fibo.py

I get the error

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

Zmienna __path__ ma bieżący katalog. Nie wiem, jak to naprawić.

Author: Mel, 2016-03-26

3 answers

Istnieją dwa sposoby uruchomienia skryptu Pythona 3.

  1. python fibo.py: argument jest nazwą pliku .py. Kropki są częścią nazwy pliku.
  2. python -m fibo: argument jest nazwą modułu Pythona, Bez .py. Kropki oznaczają Pakiety; fibo.py oznacza " moduł py w pakiecie fibo."

Jest to małe wyróżnienie dla prostego skryptu, takiego jak Twój. Ale dla czegoś większego lub bardziej złożonego, ma to istotny wpływ na zachowanie import wypowiedź:

  1. pierwszy formularz spowoduje import przeszukanie katalogu, w którym znajduje się plik .py (a następnie przeszukanie różnych innych miejsc, w tym biblioteki standardowej; Zobacz sys.path pełna lista).
  2. drugi formularz sprawi, że importprzeszukiwać będzie bieżący katalog (a następnie różne inne miejsca).

Z tego powodu, w Pythonie 3, druga forma jest wymagana dla większości konfiguracji, które obejmują pakiety (a nie tylko luźne Moduły w katalog), ponieważ pakiet nadrzędny skryptu może nie być importowany pod pierwszym formularzem, co może spowodować uszkodzenie rzeczy.

Ale dla takiego prostego skryptu, każda forma jest w porządku.

 130
Author: Kevin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-26 01:35:57

Są to dwa różne sposoby uruchamiania skryptu Pythona 3:

Python fibo.py: argumentem jest nazwa pliku. py.

Python-m fibo: argument jest nazwą modułu Pythona, bez .py

 6
Author: AMIT SAMOTA,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-05-02 04:32:37

Oprócz odpowiedzi Kevina: powinieneś dodać ścieżkę do folderu skryptu do zmiennej środowiskowej PYTHONPATH, aby działała na niektórych systemach operacyjnych.

 0
Author: Fyodor Kutsepin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-26 09:38:51