我正在使用<Python.h>
库,这是我第一次使用它并进行了一些研究。最后,我确切地发现了我的问题,但并不知道如何解决它。
我想用Beautifulsoup解析url,Python代码完美无缺,但是当我想使用PyImport_ImportModule(parser)
导入我的文件(名为parser.py)但它没有从我的文件中重新识别bs4模块导入from bs4 import BeautifulSoup
。
这是我的C程序的一部分:
PyObject *return, *module, *function, *args;
Py_Initialize();
PySys_SetPath(".");
module = PyImport_ImportModule("parser");
if(module == NULL){
PyErr_Print();
exit(1);
}
fonction = PyObject_GetAttrString(module, "link_list");
link_list
是我的Python函数,只接受一个字符串。所以我知道我必须使用PyImport
导入bs4,但没有正常工作,我仍然有这个错误:
追踪(最近一次通话): 文件&#34; ./ parser.py&#34;,第2行,in 来自bs4进口BeautifulSoup ImportError:没有名为bs4的模块
我坚持认为我的parser.py与Python2.7
完美配合,当我编译我的C程序时,我使用gcc -I/usr/include/python2.7 pars.c -lpython2.7 -o pars -Wall
但如果您需要了解我在这里使用它的方式#39;是我的Python程序:
#!/usr/local/bin/python3
from bs4 import BeautifulSoup
import urllib2
def link_list(urlString):
siteFile = urllib2.urlopen(urlString)
siteHTML = siteFile.read()
siteFile.close()
soup = BeautifulSoup(siteHTML, "html.parser")
liste = []
for links in soup.find_all('a'):
print(links.get('href'))
liste.append(links.get('href'))
return liste
如果您在尝试导入任何模块时遇到问题(在我的情况下是urllib2),您可以看到此错误:Symbol not found: __PyCodecInfo_GetIncrementalDecoder
这意味着您肯定是使用自制软件安装Python的mac用户。就我而言,我这样做了:
cp /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_io.so /usr/local/Cellar/python/2.7.13/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_io.so
取决于您使用的Python版本。如果您没有使用此sudo find / -name _io.so
并查找_io.so的/System
路径和使用最新版python的/usr/local/Cellar/python/
并使用cp
用它们命令。
答案 0 :(得分:1)
这对我有用,请试试这个:
/* 1st: Import the module */
PyObject* ModuleString = PyString_FromString((char*) "parser");
if (!ModuleString) {
PyErr_Print();
printf("Error formating python script\n");
}
PyObject* Module = PyImport_Import(ModuleString);
if (!Module) {
PyErr_Print();
printf("Error importing python script\n");
}
/* 2nd: Getting reference to the function */
PyObject* Function = PyObject_GetAttrString(Module, (char*)"link_list");
if (!Function) {
PyErr_Print();
printf("Error getting link_list()\n");
}
<强>更新强>
我附上了在MacOS上编译的完整过程。
[milinddeore@MDEORE-M-P028: ~/temp ] ls
__init__.py pars.c parser.py
[milinddeore@MDEORE-M-P028: ~/temp ] vim pars.c
#include <stdio.h>
#include <Python.h>
int main() {
Py_Initialize();
/* This is to add the path in the code */
PyObject *sys = PyImport_ImportModule("sys");
PyObject *path = PyObject_GetAttrString(sys, "path");
PyList_Append(path, PyString_FromString("."));
/* 1st: Import the module */
PyObject* ModuleString = PyString_FromString((char*) "parser");
if (!ModuleString) {
PyErr_Print();
printf("Error formating python script\n");
}
PyObject* Module = PyImport_Import(ModuleString);
if (!Module) {
PyErr_Print();
printf("Error importing python script\n");
}
/* 2nd: Getting reference to the function */
PyObject* Function = PyObject_GetAttrString(Module, (char*)"link_list");
if (!Function) {
PyErr_Print();
printf("Pass valid argument to link_list()\n");
}
Py_Finalize();
return 0;
}
[milinddeore@MDEORE-M-P028: ~/temp ] vim parser.py
#!/usr/local/bin/python2.7
from bs4 import BeautifulSoup
import urllib2
def link_list(urlString):
siteFile = urllib2.urlopen(urlString)
siteHTML = siteFile.read()
siteFile.close()
soup = BeautifulSoup(siteHTML, "html.parser")
liste = []
for links in soup.find_all('a'):
print(links.get('href'))
liste.append(links.get('href'))
return liste
[milinddeore@MDEORE-M-P028: ~/temp ] gcc -I/usr/include/python2.7 pars.c -lpython2.7 -o pars -Wall
[milinddeore@MDEORE-M-P028: ~/temp ] ls
__init__.py pars pars.c parser.py
[milinddeore@MDEORE-M-P028: ~/temp ] ./pars
AttributeError: 'module' object has no attribute 'link_list'
Pass valid argument to link_list() ===> This is because i have not passed the required argument to the function.
如果您需要任何其他详细信息,请与我们联系。希望这会有所帮助。