运行一行脚本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
这会导致什么?所有包装都已安装。所有依赖项都已安装。错误是一大堆帮助。
我已经做了我能想到的一切,到目前为止还没有解决方案。
注意:
更新:刚刚将python更新为2.7.11。消息稍有改动,但仍然没有帮助。
更新2:libsodium已损坏到看起来已加密。去搞清楚。我重新安装了downloading from GitHub并使用说明here。
感谢所有人的帮助,并感到高兴,不要冒犯你!
答案 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,请相应地调整命令...