cergmin
@cergmin
Developer

Почему из-за Popen.wait() подпроцесс работает некоректно?

Я пишу программу на python которая должна компилировать .cpp файл в .exe и запускать его.
В папке с проектом есть компилятор MinGW, с помощью него я как раз и собираюсь компилировать программу. Когда я запускаю его с помощью команды Popen в python (использовал и библиотеку subprocess, и psutil) всё работает нормально.
proc = psutil.Popen('"./MinGW/compile_code_1.cmd"', shell=True, stdout=subprocess.PIPE)

Но когда я добавляю proc.wait(), что бы дождаться окончания компиляции, MinGW выдаёт ошибку:

c:/users/cergm/desktop/unit tests/mingw/bin/../lib/gcc/mingw32/4.6.2/../../../libmingw32.a(main.o): In function `main':
C:\MinGW\msys\1.0\src\mingwrt/../mingw/main.c:73: undefined reference to `WinMain@16'
collect2: ld returned 1 exit status

Такая же ошибка возникает, когда я использую subprocess.call(), proc.communicate() и даже,
когда писал while psutil.pid_exists(proc.pid).

compile_code_1.cmd
@echo off
set PATH=%~dp0bin;%PATH%
title MinGW Portable Command Prompt
cd /d "%~dp0"
g++ ../solutions/code_1/main.cpp -o ../solutions/code_1/main
exit


main.cpp
#include <iostream>
#include <cstdio>

using namespace std;

int main(int narg, char*args[])
{
  freopen("input.txt", "r", stdin);
  freopen("output.txt", "w", stdout);
  
  int a, b;
  
  cin >> a >> b;
  
  cout << a + b;
}
  • Вопрос задан
  • 100 просмотров
Пригласить эксперта
Ответы на вопрос 2
@Zanak
1. У вас компилится windows-gui приложение. Попробуйте явно посмотреть в сторону -m параметра для g++ и добавить правильное значение в ваш cmd сценарий. Форточек под рукой нет, подробнее сказать не могу.
2. Эта функция вроде как запускает вашу команду с указанными параметрами и ждет завершения, разве нет? (Это по поводу ожидания завершения)
Ответ написан
Комментировать
cergmin
@cergmin Автор вопроса
Developer
Проблема решена, она заключается в том, что до запуска g++ я делал запись в файл main.cpp
code_1_file.write(params[1])
И файл просто не обновлялся. Что бы это исправить необходимо добавить
code_1_file.flush()
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы