Rumah > Soal Jawab > teks badan
Saya cuba menulis modul Python dalam bahasa C, tetapi program C saya sendiri bergantung pada pustaka pihak ketiga (libwiringPi.so) Apabila saya mengimport perpustakaan yang saya hasilkan dalam program sumber Python, saya akan digesa supaya fungsi tersebut belum Definisi, semua fungsi ini ada dalam pustaka pihak ketiga itu. Bagaimanakah cara saya menyusunnya supaya modul yang saya susun boleh dipautkan secara dinamik ke pustaka itu?
Saya juga cuba menggunakan gcc untuk menyusun perpustakaan pautan dinamik secara manual, dan kemudian menggunakan cyes, tetapi ralat yang sama telah dilaporkan; pakej kod.
Kod program C saya
/* Example of embedding Python in another program */
#include "python2.7/Python.h"
#include <wiringPi.h>
void initdht11(void); /* Forward */
int main(int argc, char **argv)
{
/* Initialize the Python interpreter. Required. */
Py_Initialize();
/* Add a static module */
initdht11();
/* Exit, cleaning up the interpreter */
Py_Exit(0);
return 0;
}
/* A static module */
/* 'self' is not used */
static PyObject *
dht11_foo(PyObject *self, PyObject* args)
{
wiringPiSetup();
return PyInt_FromLong(42L);
}
static PyMethodDef dht11_methods[] = {
{"foo", dht11_foo, METH_NOARGS,
"Return the meaning of everything."},
{NULL, NULL} /* sentinel */
};
void
initdht11(void)
{
PyImport_AddModule("dht11");
Py_InitModule("dht11", dht11_methods);
}
setup.py
from distutils.core import setup, Extension
dht11module = Extension('dht11',
library_dirs = ['/usr/lib'],
include_dirs = ['/usr/include'],
sources = ['math.c'])
setup (name = 'dht11',
version = '1.0',
description = 'This is a demo package',
author = 'Martin v. Loewis',
author_email = 'martin@v.loewis.de',
url = 'https://docs.python.org/extending/building',
long_description = '''
This is really just a demo package.
''',
ext_modules = [dht11module])
Mesej ralat
Traceback (most recent call last):
File "test.py", line 1, in <module>
import dht11
ImportError: /usr/local/lib/python2.7/dist-packages/dht11.so: undefined symbol: wiringPiSetup
ringa_lee2017-05-18 11:02:29
Hei, saya bangun pagi dan tiba-tiba terfikir, jadi saya cepat mencubanya.
Masalah ini berlaku kerana anda perlu menambah -lwiringPi
选项来引用这个库,但是我仔细看了以下执行 python setup.py build
之后执行的编译命令,根本就没有加这个选项,解决方式很简单,只需要修改一下setup.py,在Extension里面加上 libraries = ['wiringPi']
parameter ini semasa menyusun setup.py yang diubah suai menjadi seperti berikut
from distutils.core import setup, Extension
dht11module = Extension('dht11',
library_dirs = ['/usr/lib'], #指定库的目录
include_dirs = ['/usr/include'], #制定头文件的目录
libraries = ['wiringPi'], #指定库的名称
sources = ['math.c'])
setup (name = 'dht11',
version = '1.0',
description = 'This is a demo package',
author = 'Martin v. Loewis',
author_email = 'martin@v.loewis.de',
url = 'https://docs.python.org/extending/building',
long_description = '''
This is really just a demo package.
''',
ext_modules = [dht11module])