最近,我需要创建一个工具来抓取页面的来源,以便我可以解析出公共数据库,以便我正在处理的项目。 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代码示例;唯一的区别是我传递参数并在开头附加路径的方式。
非常感谢任何帮助。
答案 0 :(得分:2)
刚到外面快速休息一下,收集了我对错误可能是什么的想法,并设法修复它;对不起垃圾邮件。错误是我的python函数没有返回任何东西,我试图将它分配给pValue。
TypeError: an integer is required (got type NoneType)
我刚刚在我的c ++代码中取出了作业,但它确实有效。
PyObject_CallObject(pFunc, pArgs);