V2EX › Python
golang 编译为.so 库用 Python 调用后报“dlsym(0x7fe2a7d4ea30, background): symbol not found”的错误,请问是什么原因?
By myyou at 2018 年 8 月 10 日 · 3191 次点击- golang 代码:
package main
import (
"C"
"github.com/360EntSecGroup-Skylar/excelize"
)
func background(excelname, sheetname, image *C.char) *C.char {
excelname_go := C.GoString(excelname)
sheetname_go := C.GoString(sheetname)
image_go := C.GoString(image)
xlsx, err := excelize.OpenFile(excelname_go)
if err != nil {
panic(err)
}
xlsx.SetSheetBackground(sheetname_go, image_go)
err = xlsx.SaveAs(excelname_go)
if err != nil {
panic(err)
}
return C.CString("success")
}
func main() {}
import ctypes
from ctypes import cdll
def set_background():
name = b'/Users/myyou/work/background.xlsx'
background = cdll.LoadLibrary('/Users/myyou/work/excel.so').background
background.argtypes = [ctypes.c_char_p, ctypes.c_char_p, ctypes.c_char_p]
background.restype = ctypes.c_char_p
background(name, b'Sheet1', b'/Users/myyou/work/ntim.jpg')
return 'ok'
- 调用后发生的错误:
Traceback (most recent call last):
File "/Users/myyou/work/pythonenv/lib/python3.6/site-packages/IPython/core/interactiveshell.py", line 2910, in run_code
exec(code_obj, self.user_global_ns, self.user_ns)
File "<ipython-input-3-24964e319282>", line 1, in <module>
set_background()
File "/Users/myyou/work/test.py", line 275, in
background = cdll.LoadLibrary('/Users/kamui/work/excel.so').background
File "/Users/myyou/.pyenv/versions/3.6.2/lib/python3.6/ctypes/__init__.py", line 361, in __getattr__
func = self.__getitem__(name)
File "/Users/myyou/.pyenv/versions/3.6.2/lib/python3.6/ctypes/__init__.py", line 366, in __getitem__
func = self._FuncPtr((name_or_ordinal, self))
AttributeError: dlsym(0x7fe2a7d4ea30, background): symbol not found
2 条回复 • 2018-08-10 16:58:10 +08:00
|
1
myyou OP - 自己找到原因了,需要价格注释
``` import ctypes from ctypes import cdll //export background def set_background(): name = b'/Users/myyou/work/background.xlsx' background = cdll.LoadLibrary('/Users/myyou/work/excel.so').background background.argtypes = [ctypes.c_char_p, ctypes.c_char_p, ctypes.c_char_p] background.restype = ctypes.c_char_p background(name, b'Sheet1', b'/Users/myyou/work/ntim.jpg') return 'ok' ``` |
|
2
myyou OP @myyou 注释加错了,应该加载 golang 代码中
``` package main import ( "C" "github.com/360EntSecGroup-Skylar/excelize" ) //export background func background(excelname, sheetname, image *C.char) *C.char { excelname_go := C.GoString(excelname) sheetname_go := C.GoString(sheetname) image_go := C.GoString(image) xlsx, err := excelize.OpenFile(excelname_go) if err != nil { panic(err) } xlsx.SetSheetBackground(sheetname_go, image_go) err = xlsx.SaveAs(excelname_go) if err != nil { panic(err) } return C.CString("success") } func main() {} ``` |
推荐学习书目
› Learn Python the Hard Way
Python Sites
› PyPI - Python Package Index
› http://diveintopython.org/toc/index.html
› Pocoo
值得关注的项目
› PyPy
› Celery
› Jinja2
› Read the Docs
› gevent
› pyenv
› virtualenv
› Stackless Python
› Beautiful Soup
› 结巴中文分词
› Green Unicorn
› Sentry
› Shovel
› Pyflakes
› pytest
Python 编程
› pep8 Checker
Styles
› PEP 8
› Google Python Style Guide
› Code Style from The Hitchhiker's Guide