2010-01-17 3 views
3

У меня есть консольное приложение ac, которое преобразует ac-файл в html-файл, расположение файла c передается программе в качестве аргумента командной строки (приложение предназначено для окон платформа)Простой способ интегрировать приложение python gui с приложением c console

Что бы я хотел сделать, это иметь приложение python gui, чтобы пользователь мог выбрать файл и передать местоположение файла в приложение c для обработки.

Я уже знаю, как создать базовый python gui с tkinter, но я не могу найти или найти полезную информацию о том, как я хотел бы объединить две программы.

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

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

ответ

10

Возможно, вам нужен модуль subprocess.

В самом минимуме:

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 
+0

Спасибо за быстрый ответ. Я создал скрипт для проверки метода subprocess.call, hardcoding в именах файлов и т. Д., И он работал нормально, теперь я думаю, мне нужно узнать немного больше python и Tkinter, чтобы я мог понять, как собрать все это вместе, мое OO навыки программирования немного ржавые ... – volting

+0

Хорошо, мне удалось собрать все это, что оказалось намного проще, чем я думал. У меня были некоторые проблемы, которые только что оказались синтаксическими ошибками, моя среда разработки довольно примитивна в настоящий момент в основном состоит из блокнота ++, я рассмотрю более комплексное решение, когда у меня будет время, во всяком случае, im rambling ... Теперь что Iv'e достиг своей первоначальной цели, мне интересно, как я мог достичь более высокого уровня интеграции, Iv использовал расширение .pyw так, чтобы окно dos всплывало только на долю секунды, но было бы неплохо, если бы это было сделано Нет. Есть ли простой способ сделать ... – volting

+0

... это не создает проблем с созданием dll и вызовом c-функций из приложения python. – volting

2

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

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

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

Смежные вопросы