Самый простой способ интегрировать приложение Python Gui с консольным приложением C - PullRequest
3 голосов
/ 17 января 2010

У меня есть консольное приложение c, которое преобразует файл c в файл html, местоположение файла c передается программе в качестве аргумента командной строки (приложение предназначено для платформы Windows)

То, что я хотел бы сделать, - это приложение с графическим интерфейсом Python, позволяющее пользователю выбрать файл и передать местоположение файла в приложение c для обработки.

Я уже знаю, как создать базовый графический интерфейс Python с помощью tkinter, но я не могу выяснить или найти какую-либо полезную информацию о том, как бы я интегрировал эти две программы.

Может быть, возможно передать строку в приложение c с помощью метода pOpen ()? (но я не могу понять, как ...)

Примечание: я новичок в python, поэтому примеры кода могут быть полезны, а не просто описание (поскольку я не знаком со всеми библиотеками python и т. Д.), Хотя любая помощь будет приветствоваться.

Ответы [ 2 ]

10 голосов
/ 17 января 2010

Возможно, вам нужен модуль подпроцесса .

Как минимум:

import subprocess
retcode = subprocess.call(["/path/to/myCprogram", "/path/to/file.c"])
if retcode == 0:
   print "success!"

Это запустит программу с аргументами и вернет код возврата.

Обратите внимание, что subprocess.call будет блокироваться до тех пор, пока программа не будет завершена, поэтому, если она не выполняется быстро, весь графический интерфейс Tkinter перестанет перерисовываться, пока не завершится.

Для более продвинутого использования вы можете использовать subprocess.Popen. Это потребует от вас опроса, пока команда не будет выполнена, но позволит вам сделать это с меньшим количеством блокировок.

Если ваша программа на C выводит HTML в стандартный формат, вам нужно будет передать вывод следующим образом:

proc = subprocess.Popen(["/path/to/myCprogram", "/path/to/file.c"], 
                        stdout=subprocess.PIPE, stderr=subprocess.PIPE)
output, err_output = proc.communicate()
# output will now contain the stdout of the program in a string
2 голосов
/ 17 января 2010

Есть несколько способов добиться этого, но в вашем случае требования кажутся настолько простыми, что вам нужно только использовать Popen из subprocess модуля.

 process = subprocess.Popen(['myutil', file_location]...)
 process.wait()

Если вам нужно вернуть результаты вызывающей стороне, используйте PIPE для стандартного вывода и прочитайте полученные данные из него, когда подпроцесс завершится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...