【问题标题】:os.popen to subprocess conversion using pytestos.popen 使用 pytest 进行子进程转换
【发布时间】:2020-02-09 00:57:07
【问题描述】:

我之前使用 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() 不起作用。有谁知道我可以改变什么来让这个功能工作,或者建议我是否应该使用另一个功能?

【问题讨论】:

  • 不熟悉vaultvault write test/Hello value=world'是单条命令吗?试试command = subprocess.run(['vault', 'write', 'test/Hello' 'value=world'])
  • 这样的东西有用吗? print(subprocess.check_output("echo 'success'", stderr=subprocess.STDOUT, shell=True))
  • @cdarke Vault 是一种用于存储令牌和机密的工具,是的,这是一个命令。我在文件夹“test”中创建了一个名为“Hello”的秘密,其值为“world”

标签: python bash subprocess pytest hashicorp-vault


【解决方案1】:

问题在于 subprocess.run 采用的 args 参数应该是一个字符串列表。所以你需要像这样运行它:

result = subprocess.run(['vault', 'write', 'test/Hello', 'value=world'])

result = subprocess.run('vault write test/Hello value=world'.split(" "))

你可以阅读更多关于子进程模块here

【讨论】:

  • 谢谢它似乎对第一个写入命令有效,但是当我读取时似乎没有输出。因此,我设置了秘密“世界”的值,当我尝试读取该值时,它说它是“世界”,但是如果我将该读取命令放入一个变量并尝试打印该值,它说该值是无。我做了一个print(result.stdout),但收到了“无”的结果,即使我知道它是“世界”。在我做result.read() 之前它会输出“世界”而不是“无”有没有办法检查输出并获得实际值?
【解决方案2】:

感谢您的帮助!我只想打印出 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")

最后 equal 函数起作用了,因为 result 的输出是 world 并且它等于我设置的单词。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-24
    • 2020-02-26
    • 2020-11-23
    • 2011-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-09
    相关资源
    最近更新 更多