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

问题描述 投票:0回答:5

我找不到任何关于此的信息。我收到错误:

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 是否更新了其格式或其他内容?有谁知道如何解决这个问题?如果需要,我可以提供更多代码。

python pycrypto
5个回答
16
投票

卸载 pycryto 并安装 pycryptodome

pip uninstall pycrypto
pip install pycryptodome

14
投票

听起来好像 python 3.10 的扩展没有更新。

在 3.10 中,任何在解析参数时使用

#
变体的模块都需要在包含 Python.h 之前有
#define PY_SSIZE_T_CLEAN

来自文档:

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

参见 https://docs.python.org/3/c-api/arg.html#strings-and-buffers


4
投票

您可以使用 pycryptodome python 包代替 pycrypto。 Pycryptodome 似乎已经取代了当前未维护的 pycrypto 包,并且也可以与 python 3.10 相关的更改一起工作。


1
投票

我可能已经针对 AES 修复了它,很确定我针对 RIPEMD160 修复了它,因为我的

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


0
投票

尝试使用使用

bsdiff4
安装的 python 3.10 运行
conda
时遇到相同的错误。

原来

conda
有旧版本的
bsdiff4
(1.1.5)。

卸载

conda
版本的
bsdiff4
并使用
pip
重新安装最新版本 (1.2.4) 修复了该问题。

© www.soinside.com 2019 - 2024. All rights reserved.