Пример доступа к функциям Tcl из Python - PullRequest
5 голосов
/ 26 марта 2010

elmer позволяет запускать код Python из Tcl. А как же наоборот? Кто-нибудь может привести пример на Python?

Обновление : под этим я подразумеваю возможность доступа к объектам Tcl, вызова функций Tcl и т. Д. Вместо просто запуска некоторого кода Tcl.

Ответы [ 4 ]

7 голосов
/ 17 мая 2011

Это довольно старый поток, но я недавно наткнулся на Tkinter.Tcl(), который дает вам прямой доступ к интерпретатору Tcl в python без необходимости создавать Tk GUI, так как Tkinter.Tk() требует .

Пример ... предположим, что у вас есть Tcl-файл (foo.tcl) с процедурой с именем main, для которой в качестве аргумента требуется одно имя файла ... main возвращает строку, полученную из чтения foo.tcl.

from Tkinter import Tcl

MYFILE = 'bar.txt'
tcl = Tcl()
# Execute proc main from foo.tcl with MYFILE as the arg
tcl.eval('source foo.tcl')
tcl_str = tcl.eval('main %s' % MYFILE)
# Access the contents of a Tcl variable, $tclVar from python
tcl.eval('set tclVar foobarme')
tclVar = tcl.eval('return $tclVar')

Я не нашел другого способа доступа к объектам Tcl из python, кроме как через возвращаемое значение, но это дает вам способ взаимодействия с процессорами Tcl. Кроме того, вы можете экспортировать функции Python в Tcl, как описано в Использование функций Python в Tkinter.Tcl ()

4 голосов
/ 26 марта 2010

Вы можете взглянуть на стандартный модуль Python tkinter, это привязка к интерфейсу Tk, но он выполняет код Tcl в фоновом режиме.

1 голос
/ 31 марта 2010

Хотя теоретически это возможно, если предоставить некоторые пользовательские типы объектов Python, которые прозрачно обертывают уровень C Tcl_Obj *, в общем случае просто происходит обмен строками взад-вперед, поскольку семантика Ecl в Tcl может свободно отбрасывать все остальные внутренние представления.

Так что да, вы могли бы делать лучше, чем строки, но обычно это того не стоит. В Tkinter уже есть несколько возможных оптимизаций, поэтому попытайтесь украсть их там ...

0 голосов
/ 26 марта 2010

Это

import subprocess
subprocess.Popen( "tclsh someFile.tcl", shell=True )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...