系统错误: 必须为'#'格式定义PY_SSIZE_T_CLEAN宏



我在上面找不到任何东西。我收到错误:

Traceback (most recent call last):
File "/path/to/pwdb.py", line 265, in <module>
password_db()
File "/path/to/pwdb.py", line 73, in __init__
self.cipher = AES.new(key,AES.MODE_ECB)
File "/home/STACKOVERFLOW/.local/lib/python3.10/site-packages/Crypto/Cipher/AES.py", line 95, in new
return AESCipher(key, *args, **kwargs)
File "/home/STACKOVERFLOW/.local/lib/python3.10/site-packages/Crypto/Cipher/AES.py", line 59, in __init__
blockalgo.BlockAlgo.__init__(self, _AES, key, *args, **kwargs)
File "/home/STACKOVERFLOW/.local/lib/python3.10/site-packages/Crypto/Cipher/blockalgo.py", line 141, in __init__
self._cipher = factory.new(key, *args, **kwargs)
SystemError: PY_SSIZE_T_CLEAN macro must be defined for '#' formats

我很确定它收到错误的线路是:

self.cipher = AES.new(key,AES.MODE_ECB)

剧本不久前还在运行。PyCrypto更新了格式吗?有人知道如何解决这个问题吗?如果需要的话,我可以提供更多的代码。

卸载pycryto并安装pycryptodome

pip uninstall pycrypto
pip install pycryptodome

听起来扩展没有为python 3.10更新。

在3.10中,任何在解析参数时使用#变体的模块在包含Python.h之前都需要有#define PY_SSIZE_T_CLEAN

来自文档:

对于格式的所有#变体(s#、y#等(,宏在包含Python.h之前,必须定义PY_SSIZE_T_CLEAN。在Python上3.9及更早版本中,如果定义了Py_ssize_t_CLEAN宏,则长度参数的类型为Py_ssize_t,否则为int。

请参阅https://docs.python.org/3/c-api/arg.html#strings-和缓冲

您可以使用pycryptodome python包来代替pycrypto。Pycryptodome似乎已经取代了目前未维护的pycrypto包,并与python 3.10相关的更改保持原样。

我可能已经为AES修复了它,很确定我为RIPEMD160修复了它。因为我的slotmachine代码现在正在termux上运行,而以前没有。代码更改位于https://github.com/jcomeauictx/pycrypto/commit/38e5ebbf98fea96cf67b354e13fef7d1959ec34a,您可以使用pip install git+https://github.com/jcomeauictx/pycrypto进行安装。请注意,我没有尝试修复pycrypto代码中的任何安全问题,我只解决了这个PY_SSIZE_T_CLEAN问题。

相关内容

  • 没有找到相关文章

最新更新