我之前使用 os.popen(( 使用 pytest 运行我的测试,一切正常。我的所有测试都与在 Vault 中编写、修改或删除有关。问题是我的一个测试要求我获取一个返回代码值,而 os.popen(( 不提供该值,所以我已切换到 subprocess((,但现在我似乎无法让任何函数正常工作。
我一直在浏览文档,我注意到的是,我不是能够只传递像 os.popen 这样的字符串,而是我需要添加另一个参数,但我添加的任何内容都不起作用。
在我不得不切换到子流程之前,这段代码可以工作:
command = os.popen('vault write test/Hello value=world')
print(command.read())
以下是我的一个测试示例,现在失败了:
# Add secret and verify in vault
def test_add_secret_and_verify(self):
try:
command = subprocess.run('vault write test/Hello value=world')
print(command.read())
print("Secret created!")
command = subprocess.run('vault read -field=value test/Hello')
result = command.read()
print(result)
print("Verifying secret - "+result+" - is the same as created!")
self.assertEqual(result, "world")
except Exception as e:
print(e)
self.fail()
有多页错误,但最终它只是失败并说subprocess.run((不起作用。有没有人知道我可以更改什么以使此功能正常工作,或者可能建议我是否应该使用另一个功能?
问题是subprocess.run采用的args参数应该是一个字符串列表。所以你需要像这样运行它:
result = subprocess.run(['vault', 'write', 'test/Hello', 'value=world'])
或
result = subprocess.run('vault write test/Hello value=world'.split(" "))
您可以在此处阅读有关子流程模块的更多信息
谢谢你的帮助!我只想打印出 Markus 帮助我的第一个命令和我能够弄清楚的第二个命令的答案。
command = subprocess.run('vault write test/Hello value=world'.split(" "))
最终工作并创造了"世界"的价值
result = subprocess.run('vault read -field=value test/Hello'.split(" "),stdout=subprocess.PIPE,universal_newlines=True)
它最终将值添加到字符串中
self.assertEqual(result.stdout, "world")
最后,相等函数起作用,因为结果的输出是世界,它等于我设置的单词。