回溯:AttributeError:找不到符号

时间:2015-12-11 10:54:22

标签: python python-2.7

运行一行脚本import pysodium崩溃了,我无法弄清楚原因。

Traceback (most recent call last):
  File "Untitled 2.py", line 1, in <module>
    from pysodium import *
  File "/Library/Python/2.7/site-packages/pysodium/__init__.py", line 34, in <module>
    sodium.crypto_pwhash_scryptsalsa208sha256_strprefix.restype = ctypes.c_char_p
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ctypes/__init__.py", line 378, in __getattr__
    func = self.__getitem__(name)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ctypes/__init__.py", line 383, in __getitem__
    func = self._FuncPtr((name_or_ordinal, self))
AttributeError: dlsym(RTLD_DEFAULT, crypto_pwhash_scryptsalsa208sha256_strprefix): symbol not found

这会导致什么?所有包装都已安装。所有依赖项都已安装。错误是一大堆帮助。

我已经做了我能想到的一切,到目前为止还没有解决方案。

注意:

  • Libsodium;通过GitHub .ZIP安装; v1.0.7
  • Libtool程序;通过Shell脚本安装; V2.4.2
  • PySodium; v6.8通过pip install安装
  • 谷歌;没有结果
  • 冰;与谷歌相同,但更多广告
  • SO;没有帮助
  • 文件;大声笑。什么文档?
  • 重新安装;完成。没有变化。
  • Python版本:通过python.org下载2.7.11

更新:刚刚将python更新为2.7.11。消息稍有改动,但仍然没有帮助。

更新2:libsodium已损坏到看起来已加密。去搞清楚。我重新安装了downloading from GitHub并使用说明here

感谢所有人的帮助,并感到高兴,不要冒犯你!

2 个答案:

答案 0 :(得分:2)

我能够在OSX上重现相同的问题。

>>> import pysodium
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Library/Python/2.7/site-packages/pysodium/__init__.py", line 34, in <module>
    sodium.crypto_pwhash_scryptsalsa208sha256_strprefix.restype = ctypes.c_char_p
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ctypes/__init__.py", line 366, in __getattr__
    func = self.__getitem__(name)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ctypes/__init__.py", line 371, in __getitem__
    func = self._FuncPtr((name_or_ordinal, self))
AttributeError: dlsym(RTLD_DEFAULT, crypto_pwhash_scryptsalsa208sha256_strprefix): symbol not found

>>> import ctypes
>>> import ctypes.util
>>> 
>>> sodium = ctypes.cdll.LoadLibrary(ctypes.util.find_library('sodium') or ctypes.util.find_library('libsodium'))
>>> sodium
<CDLL 'None', handle fffffffffffffffe at 103e967d0>
>>> ctypes.util.find_library('libsodium')
>>> ctypes.util.find_library('sodium')

这意味着它没有找到它。

运行brew install libsodium后,该命令可以正常工作。现在,要么没有安装库(可能是shell脚本无法安装它吗?),或者它没有被Python运行时正确链接。因此,正如qarma所说,首先验证您是否拥有该库,然后您可以设置正确的LD_LIBRARY_PATH

答案 1 :(得分:1)

这不是解释如何失败的答案:

sodium.crypto_pwhash_scryptsalsa208sha256_strprefix.restype = ctypes.c_char_p

此处,sodium很可能是ctypes.CDLL("sodium")的结果,换句话说是libsodium.so的ctypes句柄。

此行尝试告诉ctypes模块rypto_pwhash_scryptsalsa208sha256_strprefix函数的返回类型是指向字符的指针,即char*

然而,加载到流程中的libsodium.so并没有这样的功能。

简而言之,libsodium.so与Python代码期望在其中找到的内容之间存在差异。

请检查系统中是否安装了多个libsodium,也许Python只是加载错误的一个;您可以使用LD_LIBRARY_PATH或显式完整路径解决此问题。

如果您有多个libsodium.*,则可以检查哪个strace -eopen python somescript.py

您可以通过运行nm -D /path/to/libsodium.so | grep scryptsalsa208sha256

来验证图书馆的符号(包括功能)

如果您正在运行OSX或Win,请相应地调整命令...