python - Python文件在单元测试失败后只读
问题描述
我正在尝试创建一个单元测试来测试以下功能:
def decrypt_keys(self, enc_password):
with open ('id_rsa','r') as privkeyfile:
pem_key = privkeyfile.read()
print(pem_key)
priv = rsa.PrivateKey.load_pkcs1(pem_key)
return rsa.decrypt(base64.b64decode(bytes(enc_password, 'utf-8')),priv).decode('utf-8')
但是,单元测试失败并出现以下错误:
ValueError: No PEM start marker "b'-----BEGIN RSA PRIVATE KEY-----'" found
----------------------------------------------------------------------
Ran 1 test in 0.012s
FAILED (errors=1)
b'-----BEGIN RSA PRIVATE KEY-----
... rest of private key here ...
-----END RSA PRIVATE KEY-----'
紧接着,可以看出,文件的内容按库的预期打印。如何确保在函数尝试将文件加载为 rsa 密钥之前完全读取文件?
解决方案
看起来您的文件中包含 Python 二进制字符串引号,这破坏了 RSA 读取代码,因为它不知道如何解释b'...'
您的私钥周围的内容。
我建议在文本编辑器中打开私钥文件并删除这些标记。您可能还想调查文件是从哪里写入的,如果它是代码的其他部分,请修复它。当您应该调用方法(例如)时,您可能正在调用str
一个对象。或者,您可以在编写文件时以二进制模式 ( ) 打开文件,然后直接写入对象。bytes
decode
binary_key_text.decode()
'wb'
bytes
您也许可以在阅读 Python 代码时解决此问题(使用类似pem_key = pem_key[2:-1]
,切断前两个字符和最后一个字符)。但是如果你把它添加到你的代码中,那么它只适用于错误写入的文件,而不是正常的文件。这就是错误如何在软件中得到体现,以便将来无法修复!(我想你可以用 来保护切片操作if pem_key.startswith("b'") and pem_key.endswith("'")
,但我只会在错误的文件编写代码已经广泛发布并且你确实需要保证向后兼容性时才会打扰。)
推荐阅读
- forms - 将表单从 https 提交到 http 时,iOS Mobile 上的 Safari 会挂起页面
- android - 我无法将预建库包含到 android studio
- vb.net - 版本冲突错误当我尝试更新 vb.net 中的共享点时
- redis - 如何让kuberbetes外部可以访问redis集群?
- c++ - 在关键区域上使用“互斥锁”数组有什么好处?
- java - 我的页面中有 3 个“愿望”链接。所以,我想获取此类链接的总数并对它们一一执行点击操作
- javascript - 当 div 覆盖另一个 div 时模拟颜色变化
- angular - 如何为离子原生视频播放器设置控件
- android - 我要安卓蓝牙广播,延迟比ADVERTISE_MODE_LOW_LATENCY少,接近苹果设备开发的10ms频率
- ios - Xcode - 为运行和测试操作设置不同的类