python - 修复与 mpd_setminalloc 相关的警告消息

标签 python c++

我经常看到

context.c:55: warning: mpd_setminalloc: ignoring request to set MPD_MINALLOC a second time

在运行时每次调用以下调用 c++ 中的 python 函数的函数后

此函数使用 Python.h,如 https://docs.python.org/2/extending/extending.html 中所述

void process_string(string text)
{
    //cout<<text<<endl;
    PyObject *pName, *pModule, *pDict, *pFunc;
    PyObject *pArgs, *pValue;

    Py_Initialize();
    PyRun_SimpleString("import sys");
    PyRun_SimpleString("import os");
    PyRun_SimpleString("sys.path.append( os.path.dirname(os.getcwd()) )");

    pName = PyUnicode_FromString("python_files.strings");
    pModule = PyImport_Import(pName);
    Py_DECREF(pName);

    if (pModule != nullptr) {
        pFunc = PyObject_GetAttrString(pModule, "process_string");
        if (pFunc && PyCallable_Check(pFunc)) {
            pArgs = PyTuple_New(1);
            pValue = PyUnicode_FromString(text.c_str());
            cout<<_PyUnicode_AsString(pValue)<<endl;
            if (!pValue) {
                Py_DECREF(pArgs);
                Py_DECREF(pModule);
                fprintf(stderr, "Cannot convert argument\n");
            }
            PyTuple_SetItem(pArgs, 0, pValue);
            pValue = PyObject_CallObject(pFunc, pArgs);
            Py_DECREF(pArgs);
            if (pValue != NULL)
            {
                //cout<<_PyUnicode_AsString(pValue)<<endl;
                Py_DECREF(pValue);
            } else {
                Py_DECREF(pFunc);
                Py_DECREF(pModule);
                PyErr_Print();
                fprintf(stderr, "Call failed\n");
            }
        } else {
            if (PyErr_Occurred())
                PyErr_Print();
            fprintf(stderr, "Cannot find function \"%s\"\n", "process_string");
        }
        Py_XDECREF(pFunc);
        Py_DECREF(pModule);
    } else {
        PyErr_Print();
        fprintf(stderr, "Failed to load \"%s\"\n", "python_files.strings");
    }
    Py_Finalize();
}

问题出在代码的 c++ 端,因为即使我将 python 函数更改为简单地返回输入,我也会在控制台上看到警告。

string.py 文件(示例):

import os
import sys
import warnings

def process_string(text):
    if not sys.warnoptions:
        warnings.simplefilter("ignore")
    return text

我尝试在 python 端禁用警告打印但没有任何优势。

最佳答案

我无法重现您描述的行为,但这很可能是因为您多次调用了 Py_Initialize

每次在第一个之后,decimal 模块被初始化并调用 mpd_setminalloc使用 minalloc_is_set == 1,因此出现警告消息。

void
mpd_setminalloc(mpd_ssize_t n)
{
    static int minalloc_is_set = 0;

    if (minalloc_is_set) {
        mpd_err_warn("mpd_setminalloc: ignoring request to set "
                     "MPD_MINALLOC a second time\n");
        return;
    }
    if (n < MPD_MINALLOC_MIN || n > MPD_MINALLOC_MAX) {
        mpd_err_fatal("illegal value for MPD_MINALLOC"); /* GCOV_NOT_REACHED */
    }
    MPD_MINALLOC = n;
    minalloc_is_set = 1;
}

你应该在一个单独的函数中初始化 Python 解释器,并且只调用一次。例如,如果你想把它放在 main 中:

int
main()
{
    int i;    

    Py_Initialize();

    for( i=0; i < 5; i++)
        process_string("A nice string");
    process_string("Another nice string");

    Py_Finalize();
    return 0;
}

请注意,您也可以将导入放在那里,因为 Python 解释器将保持事件状态,直到您的程序完成。

作为引用,我使用的编译命令是:

g++ -c -I/usr/include/python3.6m -Wno-unused-result -Wsign-compare -march=x86-64 -mtune=generic -O2 -pipe -fstack-protector-strong -fno-plt -DNDEBUG -g -fwrapv -O3 -Wall <yourprogram.cpp> -lpython3.6m

链接命令是:

g++ -g -L/usr/lib -lpython3.6m -lpthread -ldl  -lutil -lm  -Xlinker -export-dynamic -o <yourexecutable> <yourobjectfile.o>

关于python - 修复与 mpd_setminalloc 相关的警告消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49757245/

相关文章:

Python 查找问题

python - 使用 ZMQ 时,从 Ubuntu 16.04 到 Windows 7 的出站 TCP 流量被阻止

Python:可能是列表也可能不是列表的参数的最佳实践

c++ - 与字符串文字不同,为什么具有单独字符的字符数组不以空终止符结尾?

c++ - 解析括号之间的字符串

java - C++(STL)与Java中的迭代器,有概念上的区别吗?

python - 在 Python 中循环压缩多个列表

python - 如何使用facet创建条形图并使用seaborn添加标签

c++ - 有没有一种方法可以自动生成或至少缩短(例如__all__之类的参数)序列化函数?

c++ - 这是从 std::vector 中删除项目的有效方法吗?