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 后给出错误/舍入的结果的主要内容,如果未能解决你的问题,请参考以下文章