Python Ctypes,C++ 字符串到浮点数的转换在 python 中调用 Matplotlib 后给出错误/舍入的结果

Posted

技术标签:

【中文标题】Python Ctypes,C++ 字符串到浮点数的转换在 python 中调用 Matplotlib 后给出错误/舍入的结果【英文标题】:Python Ctypes, C++ String to float conversion gives wrong/rounded result after calling Matplotlib in python 【发布时间】:2020-04-27 16:03:14 【问题描述】:

我有一个通过 ctypes 从 Python 调用的 C++ 函数。在我的 python 代码中调用 matplotlib 函数后将字符串转换为浮点数或双精度时,我观察到一些奇怪的行为。调用 matplotlib 函数后,转换似乎突然停止在小数点之前。有人知道为什么会发生这种情况,以及如何防止这种情况发生吗?

这是我的 C++ 函数:

#include <iostream>

using namespace std;

extern "C"
void printDouble() 
    double result = stod("3.1415926");
    cout << result << endl;

Python 代码:

import matplotlib.pyplot as plt
import ctypes
from pathlib import Path

lib_path = Path(__file__).parent.absolute() / "str2double.so"

lib = ctypes.cdll.LoadLibrary(lib_path)

# prints correct result
print("String to double conversion before matplotlib:")
lib.printDouble()

# some matplotlib function 
plt.plot(range(10))

print("String to double conversion after matplotlib:")
# after calling matplotlib function result is wrong
lib.printDouble()

如果我执行我的 python 脚本,我会得到以下输出:

String to double conversion before matplotlib:  
3.14159  
Icon theme "gnome" not found.  
String to double conversion after matplotlib:  
3

我正在运行 Kubuntu 19.10 并使用 Python 3.7.5、Matplotlib 3.1.2 和 g++ 9.2.1 注意:使用 atof 代替 stof/stod 显示相同的行为

【问题讨论】:

【参考方案1】:

我找到了这种行为的原因。 Matplotlib 似乎将 setlocale 修改为系统语言,在我的情况下是德语。因此小数点分隔符变为“,”。

【讨论】:

以上是关于Python Ctypes,C++ 字符串到浮点数的转换在 python 中调用 Matplotlib 后给出错误/舍入的结果的主要内容,如果未能解决你的问题,请参考以下文章

字符串 到浮点数 整数 又到浮点数

有理数到浮点数

在 Python 中将 numberDecimal 值投影到浮点数中

将逗号添加到浮点数或字符串?

支持小数点和小数点逗号的字符串到浮点数转换

难以从 Ctypes 返回浮点数