Я сейчас пытаюсь запустить некоторый scrapy spider (в Python) из кода C, но я постоянно получаю segfault во время тестирования.Segfault при вложении Python с использованием scrapy в C
у меня есть этот код, который позволит мне выполнить простую функцию питона из C:
int main() {
PyObject *retour, *module, *fonction, *arguments;
char *resultat;
Py_Initialize();
PySys_SetPath(".");
module = PyImport_ImportModule("test");
fonction = PyObject_GetAttrString(module, "hellowrld);
arguments = Py_BuildValue("(s)", "hello world");
retour = PyEval_CallObject(fonction, arguments);
PyArg_Parse(retour, "s", &resultat);
printf("Resultat: %s\n", resultat);
Py_Finalize();
return 0;
}
если я вызвать функцию hellowrld, которая выглядит, как это в test.py
def hellowrld(arg):
return arg + '!!'
это будет работаю нормально, но я пытаюсь запустить функцию runpider_with_url с помощью этого кода:
# -*- coding: utf-8 -*-
import scrapy
from scrapy.crawler import CrawlerProcess
import lxml.etree
import lxml.html
class GetHtmlSpider(scrapy.Spider):
name = "getHtml"
def __init__(self, var_url=None, *args, **kwargs):
super(GetHtmlSpider, self).__init__(*args, **kwargs)
self.start_urls = [var_url]
def parse(self,response):
root = lxml.html.fromstring(response.body)
print lxml.html.tostring(root)
def runspider_with_url(var_url):
process = CrawlerProcess({
'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)'
})
process.crawl(GetHtmlSpider,var_url=var_url)
process.start()
return "It works!!"
И w курица я пытаюсь выполнить его, я постоянно получаю ошибки ошибки сегментации
Я попытался добавить это в конце моего питона
foo = runspider_with_url("http://www.google.com/")
print foo
Этот вызов работает, когда я выполнить его в Баш с помощью следующей команды:
python -c 'import get_html; get_html.runspider_with_url("https://www.wikipedia.org")'
Так что я мог бы попросить мою C программу для выполнения питона с Баш и writte результата в .txt, но я предпочел бы не так.
Благодаря
Вы не проверяете значения возврата, особенно 'PyArg_Parse'. Предположим, что она не вернула строку. – tdelaney