Компилирайте C/C++ програма и съхранявайте стандартен изход във файл чрез Python

Да кажем, че имам C/C++ файл с име userfile.c.

Използвайки Python, как мога да извикам локалния gcc компилатор, така че файлът да се компилира и да се направи изпълним файл? По-конкретно, бих искал да осигуря някакъв вход (stdin) чрез някакъв файл input.txt и искам да запазя стандартния изход в друг файл, наречен output.txt. Видях някаква документация, че ще трябва да използвам подпроцес, но не съм сигурен как да го извикам и как да предоставя персонализиран вход.


person thematroids    schedule 20.10.2015    source източник
comment
Можете да използвате SCons.   -  person Peter Wood    schedule 20.10.2015
comment
Как input.txt и output.txt се отнасят към програмата в userfile.c? Трябва ли да стартирате C изпълним файл след компилация?   -  person Mathias Rav    schedule 20.10.2015
comment
@MathiasRav: Да, искам да предоставя данните от input.txt като stdin за изпълнимия файл.   -  person thematroids    schedule 20.10.2015


Отговори (2)


Едно просто решение ще бъде както е дадено по-долу:

import subprocess

if subprocess.call(["gcc", "test.c"]) == 0:
    subprocess.call(["./a.out <input.txt >output.txt"], shell=True)
else: print "Compilation errors"

2 предупреждения:

  1. Аз кодирам неща. Може да искате да параметризирате и всичко това.
  2. Задаването на shell на True е риск за сигурността според документацията на Python.
person sam noir    schedule 20.10.2015
comment
Това не работи в Windows, но работи добре в Mac OS X. Как мога да го накарам да работи в Windows? - person thematroids; 23.01.2016

Ето едно възможно решение (написано за Python 3):

import subprocess

subprocess.check_call(
    ('gcc', '-O', 'a.out', 'userfile.c'),
    stdin=subprocess.DEVNULL)

with open('input.txt') as infile, open('output.txt', 'w') as outfile:
    subprocess.check_call(
        ('./a.out',),
        stdin=infile,
        stdout=outfile,
        universal_newlines=True)

Параметърът universal_newlines кара subprocess да използва низове вместо байтове за вход и изход. Ако искате байтове, а не низове, отворете файловете в двоичен режим и задайте universal_newlines=False.

При грешки при компилиране или изпълнение в двете програми, subprocess.CalledProcessError ще бъде отгледано от subprocess.check_call.

person Mathias Rav    schedule 20.10.2015