#python #c #testing #io
#python #c #тестирование #io
Вопрос:
В настоящее время я пытаюсь автоматизировать тестирование программы на C , которая принимает входные данные с терминала и выводит результат на терминал. Например, мой файл на C будет делать что-то вроде приведенного ниже:
#include <iostream>
int main() {
int a, b;
std::cin >> a >> b;
std::cout << a b;
}
И мой файл Python, используемый для тестирования, будет выглядеть так:
as = [1, 2, 3, 4, 5]
bs = [2, 3, 1, 4, 5]
results = []
for i in range(5):
# input a[i] and b[i] into the C program
# append answer from C program into results
Хотя можно вводить и выводить данные с C через файловый ввод-вывод, я бы предпочел оставить программу C нетронутой.
Что я могу сделать вместо закомментированных строк в программе Python?
Ответ №1:
Вы могли бы использовать subprocess.Popen
. Пример кода:
#include <iostream>
int sum(int a, int b) {
return a b;
}
int main ()
{
int a, b;
std::cin >> a >> b;
std::cout << sum(a, b) << std::endl;
}
from subprocess import Popen, PIPE
program_path = "/home/user/sum_prog"
p = Popen([program_path], stdout=PIPE, stdin=PIPE)
p.stdin.write(b"1n")
p.stdin.write(b"2n")
p.stdin.flush()
result = p.stdout.readline().strip()
assert result == b"3"
Ответ №2:
python_program.py | cpp_program
В командной строке стандартный вывод python_program.py
будет передан в стандартный ввод cpp_program
.
Это работает для всех исполняемых файлов, независимо от того, на каком языке программирования они написаны.
Комментарии:
1. Я думаю, вопрос не в том, как передать выходные данные из скрипта python в приложение cpp. Похоже, что Джордж пытается ввести значения в приложение cpp и проверить ожидаемый результат.
Ответ №3:
Вы можете объединить его с помощью .txt Написать txt с вашей матрицей и прочитать его на Python, 2 программы не могут использовать одну и ту же память.
В противном случае используйте Cython и кодируйте свой C на Python https://github.com/cythonbook/examples/tree/master/07-wrapping-c/01-wrapping-c-functions-mt-random
Ответ №4:
Вы можете использовать supprocess для получения данных из вызываемой программы, например, для whois:
import subprocess
proc = subprocess.Popen(['whois', 'google.com'], stdout=subprocess.PIPE)
data = proc.communicate()[0]
print( data )
Ответ №5:
Вам нужно будет использовать subprocess
модуль pythons (https://docs.python.org/2/library/subprocess.html ), чтобы запустить ваше скомпилированное приложение на C и отправить ваши переменные и прочитать выходные данные подпроцесса, используя Popen.communicate()
(https://docs.python.org/2/library/subprocess.html#subprocess .Popen.communicate).
Пример кода может выглядеть так:
import subprocess
p = subprocess.Popen(["cpp_app", stdin=subprocess.PIPE,stdout=subprocess.PIPE)
out, _ = p.communicate(b"1 2")
print(out, err)