嵌入式Python在C ++中的线程错误

时间:2015-10-21 05:07:20

标签: python c++

最近,我需要创建一个工具来抓取页面的来源,以便我可以解析出公共数据库,以便我正在处理的项目。 Python似乎是一个简单的解决方案,但它是一个痛苦的启动和运行,目前我有一半工作(保存源文件而不是返回)。当我运行我的c ++代码时,我得到一个奇怪的错误......

Exception ignored in: <module 'threading' from 'C:\\Python34\\Lib\\threading.py'
>
Traceback (most recent call last):
  File "C:\Python34\Lib\threading.py", line 1293, in _shutdown
    t = _pickSomeNonDaemonThread()
  File "C:\Python34\Lib\threading.py", line 1300, in _pickSomeNonDaemonThread
    for t in enumerate():
  File "C:\Python34\Lib\threading.py", line 1270, in enumerate
    return list(_active.values()) + list(_limbo.values())
TypeError: an integer is required (got type NoneType)

我的Python代码:

import urllib.request
import sys

def run(a):
    req = urllib.request.Request(a)
    res = urllib.request.urlopen(req)
    d = str(res.read())

    with open('temp.dat', 'w') as outfile:
        for x in range(0, len(d)):
            outfile.write(d[x])

上面的代码工作正常,并没有发出任何错误,所以我觉得错误是在我的c ++实现中的某个地方。无论如何,我觉得值得一提的是它成功地将网站(参数a)源代码保存到了&#39; temp.dat&#39;文件,我只是试图摆脱错误报告。

我的C ++代码:

void pyCall(string url, string outfile, char* mod = "Scrape", char * dat = "run")
{
PyObject *pName, *pModule, *pDict, *pFunc;
PyObject *pArgs, *pValue, *pOutfile, *pURL;
int i;

Py_Initialize();

PyObject* sysPath = PySys_GetObject((char*)"path");
PyList_Append(sysPath, PyUnicode_FromString("."));

pName = PyUnicode_FromString(mod);

/* Error checking of pName left out */

pModule = PyImport_Import(pName);
Py_DECREF(pName);

if (pModule != NULL) 
{
    pFunc = PyObject_GetAttrString(pModule, dat);
    /* pFunc is a new reference */

    if (pFunc && PyCallable_Check(pFunc)) 
    {
            /* pValue reference stolen here: */
            pArgs = Py_BuildValue("(s)", url.c_str());

        pValue = PyObject_CallObject(pFunc, pArgs);
        Py_DECREF(pArgs);
        if (pValue != NULL) 
        {
            printf("Result of call: %ld\n", PyLong_AsLong(pValue));
            Py_DECREF(pValue);
        }
    }

    Py_XDECREF(pFunc);
    Py_DECREF(pModule);
}
Py_Finalize();
}

现在这段代码非常标准,并且是一个“千篇一律”的代码。 Python https://docs.python.org/3.5/extending/embedding.html上的API代码示例;唯一的区别是我传递参数并在开头附加路径的方式。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

刚到外面快速休息一下,收集了我对错误可能是什么的想法,并设法修复它;对不起垃圾邮件。错误是我的python函数没有返回任何东西,我试图将它分配给pValue。

TypeError: an integer is required (got type NoneType)

我刚刚在我的c ++代码中取出了作业,但它确实有效。

PyObject_CallObject(pFunc, pArgs);