Python启动时出现NaN错误?

4
我将使用 Python4Delphi 在 Delphi 程序中嵌入 Python。版本: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标准启动和嵌入式启动之间的差异,从而导致此类错误吗?
2个回答

5
这很可能是因为Python使用了不同于Delphi的控制词(CW)设置。尝试使用以下代码:
var
  OldControlWord: Word;
begin
  OldControlWord := Get8087CW();
  Set8087CW($133F);
  try
    // perform your Python code here
  finally
    Set8087CW(OldControlWord);      
  end;
end;

请查看我的有关Delphi中8087 CW的博客文章,以获取有关$133F值更详细的解释。
T8087Precision类型需要JCL(该类型位于Jcl8087单元中)。

--jeroen


1
哇,上一次我处理8087问题还是在TP7时代。这是正确的答案,现在代码可以毫无问题地运行了。非常感谢。 - Muhammad Alkarouri

1
我使用以下内容: $1332 是 Delphi 的默认值。 $1232 是处理 Python Issue 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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接