Как заставить Tkinter использовать любой данный интерпретатор Tcl, кроме общесистемного интерпретатора Tcl

У меня есть устаревшее приложение на основе Tcl, и я планирую написать для него оболочку Python. Мое устаревшее приложение Tcl поставляется с собственным интерпретатором Tcl. Он не использует интерпретатор, предоставляемый системой.

Я планирую использовать Tkinter.Tcl() для подключения к интерпретатору Tcl и выполнения инструкции Tcl с помощью eval.

Но Tkinter Python вызывает интерпретатор Tcl по умолчанию, установленный в системе. Как указать Tkinter использовать интерпретатор Tcl, поставляемый с моим устаревшим приложением???

PS: у меня нет привилегий суперпользователя в системе, но я могу пересобрать Python или Tcl или оба в моем локальном рабочем пространстве.


person Vivek Jha    schedule 03.07.2013    source источник
comment
Какие платформы ОС вы используете?   -  person Ned Deily    schedule 04.07.2013


Ответы (1)


Вся связь с библиотеками Tk происходит через модуль расширения Python _tkinter.so C. Вы можете попытаться просто собрать его, связав с вашими библиотеками, но это гарантированно сработает только в том случае, если _tkinter.so собран с теми же параметрами, что и системный Python, используемый на всех ваших пользовательских системах. Самый безопасный и надежный способ — создать собственный Python, связанный с вашим Tcl/Tk, и отправить его как часть вашего приложения. Может быть немного сложно заставить Python связываться с Tcl/Tk в нестандартном месте; проще всего будет изменить метод detect_tkinter в файле верхнего уровня Python setup.py для поиска файлов include и lib в нужных местах. (setup.py — это то, что управляет сборкой модулей стандартной библиотеки Python, включая _tkinter.so.)

person Ned Deily    schedule 04.07.2013
comment
Я надеюсь, что должен быть какой-то более простой или прямой путь. - person Vivek Jha; 05.07.2013
comment
Python встраивает Tcl/Tk, используя довольно низкоуровневые C API. Плохие вещи могут случиться, если версии Tcl и Tk, с которыми был собран Python, не совпадают с версиями, с которыми он позже будет выполняться. Вы просто не можете быть уверены, что это сработает. - person Ned Deily; 05.07.2013
comment
Кроме того, нет ничего необычного в том, чтобы включить встроенный Python в приложение. Если вы собираетесь выпускать свой собственный Tcl, почему бы не использовать и собственный Python? - person Ned Deily; 05.07.2013
comment
Я согласен с доставкой python вместе с приложением, но как мне убедиться, что python будет указывать на Tcl, поставляемый с приложением. - person Vivek Jha; 06.07.2013
comment
Возможно, статически связать Tcl и Tk с Python. В противном случае вы должны иметь возможность определить структуру каталога доставки и либо добавить параметры -rpath к шагу ссылки _tkinter, либо убедиться, что LD_LIBRARY_PATH устанавливается во время выполнения, чтобы включить расположение ваших библиотек Tcl и Tk. - person Ned Deily; 06.07.2013