os.popen для преобразования подпроцесса с помощью pytest - PullRequest
0 голосов
/ 11 октября 2019

Я использовал os.popen (), прежде чем запускать свои тесты с pytest, и все работало. Все мои тесты связаны с записью, изменением или удалением в Vault. Проблема в том, что один из моих тестов требует, чтобы я получил значение кода возврата, которое недоступно с os.popen (), поэтому я переключился на subprocess (), но теперь я не могу получить какой-либо изфункции работают.

Я просматривал документацию, и я заметил, что вместо возможности просто передать строку, например, os.popen, нужно ли мне добавить другой параметр, но все, что я добавляю, не 't work.

Этот код используется для работы до того, как мне пришлось переключиться на подпроцесс:

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 () не работает. Кто-нибудь имеет представление о том, что я мог бы изменить, чтобы заставить эту функцию работать, или, может быть, порекомендовал бы мне использовать другую функцию?

Ответы [ 2 ]

1 голос
/ 11 октября 2019

Проблема в том, что аргумент args, который принимает subprocess.run, должен быть списком строк. Поэтому вам нужно запустить его следующим образом:

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

или

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

Подробнее о модуле подпроцесса можно прочитать здесь

0 голосов
/ 11 октября 2019

Спасибо за помощь! Я просто хочу распечатать ответ на первую команду, с которой мне помог Маркус, и на вторую команду, которую я смог выяснить.

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

В итоге все заработало и создалозначение 'world'

result = subprocess.run('vault read -field=value test/Hello'.split(" "),stdout=subprocess.PIPE,universal_newlines=True)

заканчивается добавлением значения в строку

self.assertEqual(result.stdout, "world")

Наконец-то работает функция равенствапотому что результат результата - мир, и он равен слову, которое я установил.

...