【问题标题】:Can't locate a python script from error message无法从错误消息中找到 python 脚本
【发布时间】:2019-05-11 19:34:23
【问题描述】:

我正在尝试追踪我在尝试运行我的代码 test.py 时收到的 python 错误消息的来源。

我试图从错误输出中追踪的模块(由test.py 调用)显然是:

build/bdist.linux-x86_64/egg/george/gp.py

错误信息sn-p:

File "build/bdist.linux-x86_64/egg/george/gp.py", line 498, in
    predict
  1. 我可以找到build/bdist.linux-x86_64/,但它是空的。也许它不是“正确的”。
  2. 我还发现了 gp.py 的不同版本,但是当我对其进行更改时,没有任何反应,因此 test.py 没有调用该版本。

我要做的就是找到发生错误的代码,这样我就可以向其中添加更多输出以找出问题所在。


这是错误信息:

Traceback (most recent call last):
  File "test.py", line 213, in <module>
    mumc, dummy = gp1.predict(residuals, dates, kernel = kernelprime )
  File "build/bdist.linux-x86_64/egg/george/gp.py", line 511, in predict
  File "build/bdist.linux-x86_64/egg/george/solvers/basic.py", line 87, in apply_inverse
  File "/home/me/.local/lib/python2.7/site-packages/scipy/linalg/decomp_cholesky.py", line 174, in cho_solve
    b1 = asarray_chkfinite(b)
  File "/home/me/.local/lib/python2.7/site-packages/numpy/lib/function_base.py", line 1219, in asarray_chkfinite
"array must not contain infs or NaNs")
ValueError: array must not contain infs or NaNs

所以很明显,在某些时候,我将一个包含 infs 或 NaNs 的数组输入到一些它不喜欢的 scipy 或 numpy 代码中。但是首先要了解为什么这些值是 infs 或 NaNs,似乎在 predict 模块中发生了任何问题。

(gp1 是在gp.py 代码中定义的类!)

【问题讨论】:

  • 你确定你的错误是在“build/bdist.linux-x86_64/egg/george/gp.py”吗?这是一个相当深的系统文件。也许是其他原因导致您的代码出现错误?
  • 检查错误的来源,这通常是原因。
  • 是的,请包括整个错误回溯
  • 好的,我已将错误消息添加到我的原始帖子中,谢谢。
  • 我在这里猜测,但看起来你的无穷大/NaN 是因为协方差矩阵中的值为零(因此协方差矩阵是不可逆的)而生成的。关于找到正确的版本,您应该能够使用george.__file__ 获得模块的绝对路径,这应该有助于您更好地了解活动文件的位置。

标签: python build egg


【解决方案1】:

在将模块编译为 Python 字节码时,Python 将源文件路径存储在模块的字节编译版本中。这些字节编译的版本通常是“即时”生成并自动重复使用的。

您的程序无意中使用了树中某处的gp.pyc 文件,该文件是从您看到的build/... 路径中的gp.py 编译的。通常,build/ 仅在构建包时使用。我怀疑你在构建george egg 时搞砸了。

检查 Python 路径中的 .pyc 文件并将其删除。它们将自动重建(假设找到了真正的 .py 文件)。

例如从你的项目目录:

$ find . -name `*.pyc` -exec rm {} \;

【讨论】:

  • @user1551817 这个答案似乎是正确的,如果对你有帮助,请检查一下。
【解决方案2】:

您可以使用模块上的.__file__ 属性或调用inspect.getfile() 来查看实际加载的文件。

您的示例未提及,但您可能在 test.py 中导入了 gpgp1。你可以试试:

import gp
import inspect

print(gp.__file__)
print(inspect.getfile(gp))

这两行都应该从 Python 的角度向您显示实际加载的文件,并且应该允许您跟踪存在问题的文件。

【讨论】:

    猜你喜欢
    • 2014-05-28
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 2019-01-08
    • 2010-11-05
    • 2016-12-13
    相关资源
    最近更新 更多