os.popen 到 pytest 的子进程转换



我之前使用 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")

最后,相等函数起作用,因为结果的输出是世界,它等于我设置的单词。

最新更新