【问题标题】:NaN giving an error depending on Python startup?NaN 根据 Python 启动给出错误?
【发布时间】:2010-10-14 13:50:58
【问题描述】:

我正在使用Python4Delphi 将 Python 嵌入到 Delphi 程序中。版本:Python 2.6.4、Delphi 2009、Windows XP。

导入json 时,Delphi 程序因 EInvalidOp 崩溃。我追踪到了这条线

NaN, PosInf, NegInf = float('nan'), float('inf'), float('-inf')

json.decoder.

果然,当在 Delphi 程序中嵌入的 Python 中运行时,命令 float('nan') 会引发 EInvalidOp。在命令行 Python 中执行时(相同的安装),它只返回 nan

知道 Python 标准启动和嵌入式启动之间有什么区别可能导致这样的错误吗?

【问题讨论】:

    标签: python delphi embedding


    【解决方案1】:

    这很可能是 Python 使用了与 Delphi 不同的8087 control word (CW) 设置。

    试试这种代码:

    var
      OldControlWord: Word;
    begin
      OldControlWord := Get8087CW();
      Set8087CW($133F);
      try
        // perform your Python code here
      finally
        Set8087CW(OldControlWord);      
      end;
    end;
    

    请参阅我的blog article on the 8087 CW in Delphi,了解有关 $133F 价值的更详细说明。
    它需要JCL 用于T8087Precision 类型(在Jcl8087 单元中)。

    --杰罗恩

    【讨论】:

    • 哇。我必须处理的最后一个 8087 问题是 TP7。这是正确的答案,代码现在可以顺利运行。非常感谢。
    【解决方案2】:

    我使用以下内容: 1332 美元是 delphi 默认值。 1232 美元是处理 Python 问题 9980 的价值。

    procedure MaskFPUExceptions(ExceptionsMasked : boolean);
    begin
    //  if ExceptionsMasked then
    //    Set8087CW($1332 or $3F)
    //  else
    //    Set8087CW($1332);
      if ExceptionsMasked then
        Set8087CW($1232 or $3F)
      else
        Set8087CW($1232);
    end;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-15
      • 2018-09-02
      • 1970-01-01
      • 2015-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多