C - 导入Python模块

时间:2017-02-22 13:51:10

标签: python c python-2.7 beautifulsoup python-import

我正在使用<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用它们命令。

1 个答案:

答案 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. 

如果您需要任何其他详细信息,请与我们联系。希望这会有所帮助。