gpt4 book ai didi

python - 将调用 C 函数的 Python 2.7 代码移植到 Python 3.4

转载 作者:行者123 更新时间:2023-11-30 18:53:21 25 4
gpt4 key购买 nike

我正在尝试从 Python 3.4.so 文件调用 C 函数。我已经进行了一些必要的更改,以使 Python 2.7 代码能够与 Python 3.4 配合使用,但我仍然遇到 致命 Python 错误:段错误

代码来自这个Bitbucket hosted project 。我已经通过 pip3 安装了它(pip3 install Lemmagen),它还创建了我尝试从 Python3 使用的 .so 文件。

这里是原始的 Python2.7 代码(调用 C 代码的函数),它可以从命令行与 python 正常运行。

def lemmatize(self, word):
if (self._output_buffer_len < 2 * len(word)):
self._output_buffer_len = 2 * len(word)
self._output_buffer = create_string_buffer(self._output_buffer_len)

is_unicode = isinstance(word, unicode)
if is_unicode:
word = word.encode('utf-8')

self._lib.lem_lemmatize_word(word, self._output_buffer)
return self._output_buffer.value.decode('utf-8') if is_unicode else self._output_buffer.value

这就是我试图使其适应Python3.4的方式:

def lemmatize(self, word):
if (self._output_buffer_len < 2 * len(word)):
self._output_buffer_len = 2 * len(word)
self._output_buffer = create_string_buffer(self._output_buffer_len)

word = word.encode('utf-8')


self._lib.lem_lemmatize_word(word, self._output_buffer) #SEGFAULT HERE!
#return "HERE"
return self._output_buffer.value.decode('utf-8')

我删除了检查 word 是否为 unicode 的行,因为 Unicode 在 Python3.x 中是默认的。我仍然 80% 确定这是一个字符编码问题。我必须使用什么编码来将字符串变量传递给函数调用 self._lib.lem_lemmatize_word(word, self._output_buffer)?这正是发生段错误的行:

致命的Python错误:段错误

Current thread 0xb754b700 (most recent call first):
File "/usr/local/lib/python3.4/dist-packages/lemmagen/lemmatizer.py", line 66 in lemmatize
File "<stdin>", line 1 in <module>
Segmentation fault (core dumped)

我一直在尝试阅读我的确切问题(编码类型),但到目前为止我发现的任何内容似乎都无法解决这个问题。我希望得到一些有关这方面的深思熟虑的信息。谢谢。

感谢任何在没有任何理由或任何评论的情况下否决该问题的人。

最佳答案

您需要使用 create_string_buffer 函数创建一个 char 数组,然后再将其传递给该函数。

这样的事情应该有效:

    import ctypes

class Lib:
def __init__(self):
self.lib = ctypes.cdll.LoadLibrary('/home/pim/slovene_lemmatizer/bin/libLemmatizer.so')


def lemmatize(self, word):
text = "text"
output_buffer = ctypes.create_string_buffer(text.encode())

word_buffer = ctypes.create_string_buffer(word.encode())

self.lib.lem_lemmatize_word(word, output_buffer)

print("test")

def main():
lib = Lib()
lib.lemmatize("test")


if __name__ == '__main__':
main()

此输出:

pim@pim-desktop:~/slovene_lemmatizer/bin$ python3 main.py
[错误] 必须首先加载词形还原器的语言文件!
测试
pim@pim-desktop:~/slovene_lemmatizer/bin$

编辑:虽然我不能 100% 确定这里使用的“raw”属性是否正确,但它确实有效!Edit2:它确实可以在没有原始属性的情况下工作,更新了 awnser

关于python - 将调用 C 函数的 Python 2.7 代码移植到 Python 3.4,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32988834/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com