查找“fibo.py”规范时出错(<class 'AttributeError'>: 'module' object has no attribute '__path__')

Posted

技术标签:

【中文标题】查找“fibo.py”规范时出错(<class \'AttributeError\'>: \'module\' object has no attribute \'__path__\')【英文标题】:Error while finding spec for 'fibo.py' (<class 'AttributeError'>: 'module' object has no attribute '__path__')查找“fibo.py”规范时出错(<class 'AttributeError'>: 'module' object has no attribute '__path__') 【发布时间】:2016-07-13 19:58:37 【问题描述】:

我在 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__ 变量具有当前目录。我不确定如何解决这个问题。

【问题讨论】:

【参考方案1】:

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

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

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

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

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

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

【讨论】:

显然第二种形式对于这种情况并不适用,看看它是如何引发错误的。 @TadhgMcDonald-Jensen:仔细看看。 OP 在模块名称后放置一个 .py 。模块名不是文件名。 @Kevin - 谢谢。我为模块添加了 .py 扩展名,因此出现了错误,这对我来说完全是误导。谢谢指正。 似乎我们也必须使用 -m 选项来传递参数....... 我想你为我节省了 2 个小时来弄清楚我的 Jenkins 构建失败的原因 :) 谢谢!【参考方案2】:

除了 Kevin 的回答:您应该将脚本文件夹的路径添加到 PYTHONPATH 环境变量中,以使其在某些操作系统上工作。

【讨论】:

【参考方案3】:

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

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

python -m fibo:参数是Python模块的名称,不带.py

【讨论】:

谢谢@AMIT SAMOTA 我阅读了上面的答案,但你的答案清晰而快速。我重读了第一个答案,现在我都明白了。对于其他读者,您可能正在寻找不带 .py 位的 python -m com.mypackage.mypythongfile。

以上是关于查找“fibo.py”规范时出错(<class 'AttributeError'>: 'module' object has no attribute '__path__')的主要内容,如果未能解决你的问题,请参考以下文章

查找“pyspark.worker”的模块规范时出错(ModuleNotFoundError:没有名为“pyspark”的模块)

从相机中查找帧差异时出错

C程序查找最大和最小元素时出错

前端开发规范手册

Executing modules as scripts

在 Python 中规范化嵌套列表时出错