查找“fibo.py”规范时出错(<类“AttributeError”>:“模块”对象没有属性“__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__ 变量有当前目录。我不确定如何解决这个问题。

原文由 Eternal Learner 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 797
2 个回答

有两种方法可以运行 Python 3 脚本。

  1. python fibo.py :参数是 .py 文件的名称。点是文件名的一部分。
  2. python -m fibo :参数是 Python 模块的名称,没有 .py 。点表示包裹; fibo.py 表示“包中的模块 py fibo ”。

对于像您这样的简单脚本,这是一个小区别。但是对于更大或更复杂的东西,它对 import 语句的行为有重要影响:

  1. 第一种形式将导致 import 搜索 .py 文件所在的目录(然后搜索各种其他地方,包括标准库;参见 sys.path 列表)。
  2. 第二种形式将使 import 搜索 当前 目录(然后是其他各个地方)。

出于这个原因,在 Python 3 下,大多数涉及包的设置都需要第二种形式(而不仅仅是目录中的松散模块),因为脚本的父包在第一种形式下可能无法导入,这可能会导致事情打破。

但是对于像这样的简单脚本,任何一种形式都可以。

原文由 Kevin 发布,翻译遵循 CC BY-SA 3.0 许可协议

这是运行 python 3 脚本的两种不同方式:

python fibo.py:参数是.py文件的名称。

python -m fibo: 参数是一个Python模块的名字,没有.py

原文由 AMIT SAMOTA 发布,翻译遵循 CC BY-SA 4.0 许可协议