Как использовать Python для ввода и получения выходных данных из программы на C ?

#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)