我正在使用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
中的。
果然,命令float('nan')
在Delphi程序中嵌入的Python内部运行时会引发EInvalidOp
。在命令行Python(同一安装)中执行时,它只返回nan
。
知道Python标准启动和嵌入式启动之间有什么区别可能导致这样的错误?
答案 0 :(得分:5)
这很可能是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;
有关$ 133F价值的更详细说明,请参阅我的blog article on the 8087 CW in Delphi
它需要T8087Precision
类型的JCL(Jcl8087
单位)。
- 的Jeroen
答案 1 :(得分: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;