Можете ли вы встроить сценарий TCL в сценарий Bash или сценарий Python, который может вызываться внешними программами?

1

Я пишу script, чтобы извлечь некоторые полезные данные о серии химических симуляций, которые я использовал.

Чтобы получить эти данные, мне нужна (1) C-программа, которая вычисляет плотность из типа файла, называемого *.pdb. У меня уже есть (1). И (2) Мне нужно использовать программу под названием vmd для получения этого pdb. Чтобы выполнить (2) из ​​командной строки, я могу отправить tcl script, поскольку vmd имеет сборку в tcl-интерпретаторе.

Эти функции - вызов vmd для запуска tcl script, а затем выполнение скомпилированной c-программы - это ключевые действия моего извлечения данных оболочки script.

Я хотел бы устранить лишний TCL script, уменьшив число из 2 сценариев (обертка script + tcl script для vmd) до 1. Но я не уверен, как это сделать. По-видимому, одним из возможных решений является встроить мой TCL script в мою оболочку script, если есть способ сделать такой встроенный script доступным для внешних программ.

Большинство моих сценариев сбора данных до сих пор находились в BASH, поэтому в идеале я хотел бы придерживаться BASH script, поскольку я очень хорошо знаком с сценарием BASH, поскольку имею только начало знания Python/Perl.

Вот мои вопросы:
1. Можете ли вы встроить TCL script внутри BASH script?
2. Можете ли вы сделать этот script доступным для внешней программы?
например в псевдокоде:

#!/bin/bash
....
tclembed extract {
   #tcl script
   ...
}
...
vmd -dispdev text -e extract.tcl >& extract_results.log #where vmd is 
                                                        #an external program

3. Если ответ на # 2 - нет, можете ли вы сделать это на Python, возможно, с помощью библиотеки Minotaur? Я бы рассмотрел переход на python, если так...
http://markmail.org/message/6kogjphzqtn4ilch
4. Если нет, как бы вы предложили попытаться объединить эти два сценария (подпрограмму tcl и BASH script, которая вызывает это) в один файл?
5. Если кто-то получил внешние вызовы такого характера для работы с помощью Minotaur, можете ли вы разместить пояснительный код?

Я подумал о одном не-встраивающем решении, которое должно быть # 4, которое должно было бы написать функцию в моем BASH script, который записывает файл со всем tcl script. Таким образом, у меня был бы единственный script, но он мог бы сбрасывать индекс для использования с внешними программами, а затем удалять его. У меня такое ощущение, что это решение является довольно глупым, хотя я точно знаю, что он работает, а также встроенные решения.

  • 0
    Tcl включен (хотя и в ограниченной форме) в Python. См. Wiki.python.org/moin/How%20Tkinter%20can%20exploit%20Tcl/…
  • 0
    Разве это не только для однострочников TCL все же? Все примеры, которые я видел, были отдельными командами. Я хотел бы встроить весь непрерывный скрипт, например, в тройные кавычки. "" "" "". Это то, что я готов был возможен с минотавром.
Теги:
scripting
tcl
embedding

2 ответа

4
Лучший ответ

Было несколько сплавов Tcl-Python. Как отмечает Rafe Kettler над эскизами, место для начала - стандартная установка Python. Это включает в себя Tkinter, который строит полный интерпретатор Tcl, доступный, как описано на упомянутой странице Wiki. Итак, да, это возможно "сделать это в Python".

Я действительно не понимаю, что это связано с vmd. vmd уже работает в Tcl-интерпретаторе. Хотя я полностью поддерживаю цель "сокращения движущихся частей", так что у вас есть, например, один script, а не два, кодирующий что-то в Python, когда vmd уже предоставляет Tcl, doesn Кажется, это шаг в сторону Джейсона Р. Мика хочет пойти.

SOMEWHAT LATER: после обмена комментариями с Джейсоном Р. Миком мне пришло в голову, что он может найти

#!/bin/bash


echo "Here a bit of bash-iness."

MYSCRIPT='
puts "Here I am, inside Tcl."
puts "See?  I can do calculations:  [expr 3 + 5]."
exit 0
'

tclsh << HERE
$MYSCRIPT
HERE

наводит на мысль. Его выход, конечно,

Here a bit of bash-iness.
Here I am, inside Tcl.
See?  I can do calculations:  8.

Я написал это в терминах tclsh, но, если я не отстаю, Джейсон Р. Мик на самом деле захочет использовать vmd. Соответствующий гомолог для * vmd - это что-то вроде

    ...
vmd -dispdev text -eofexit << HERE > output.log
$MYSCRIPT
HERE

Пока я могу думать о нескольких других способах объединения bash и Tcl, я считаю, что это наиболее в духе оригинального вопроса.

Хочу также отметить, что из того, что мне известно о vmd, было бы вполне целесообразно сделать то же самое с Python вместо Tcl: vmd также хорошо разбирается.

Наконец, оба Python и Tcl - это языки общего назначения, имеющие примерно такую ​​же мощность, что и bash, поэтому еще одно направление для этого проекта - записать его полностью в Tcl (или Python), а не bash. Встраивание сценариев по пути, проиллюстрированному выше, по меньшей мере так же легко в Tcl (или Python), как в bash.

  • 0
    Перечитайте описание моей проблемы. Я хочу встроить tcl-скрипт, который я могу отправить во внешнюю программу, которую я вызываю. Независимо от того, встроен ли сценарий или находится в отдельном файле, мне нужен vmd для запуска этого сценария, чтобы сгенерировать мои данные. В идеале я хотел бы встроить скрипт в мою оболочку (скрипт BASH), вызвать vmd из моей оболочки, передать ему встроенный скрипт, а затем завершить, обработав результаты в моем скрипте оболочки (вызов моей программы на c и т. Д.). иметь только (1) рабочую часть. Я не думаю, что вы поняли мое описание проблемы.
  • 0
    Вы забыли в конце vmd -dispdev text -eofexit << HERE > output.log . Разместите, пожалуйста, когда сможете! Красиво сделано!
1

1. Можете ли вы встроить TCL script внутри Bash script?

Не легко. Лучший способ - записать script во временный файл и передать имя этого файла в tclsh (или wish, если это программа Tcl/Tk). Это должен быть "простой вопрос программирования", т.е. Некоторая неудобная кодировка, но не принципиально сложная.

2. Можете ли вы сделать эту script вызываемой внешней программой?

Я не совсем понимаю, что вы хотите здесь сделать. Вы можете поместить строку #! в начале Tcl script и пометить исполняемый файл. Это хорошо работает. Лучший способ сделать это - this:

#!/usr/bin/env tclsh8.5
your tcl script here...

3. Если ответ на # 2 - нет, можете ли вы сделать это в Python?

Эта страница wiki упоминает что-то типа Typcl, о котором сообщается, что позволяет делать Tcl изнутри Python. Я никогда не пробовал.

(Я думаю, что вопросы 4 и 5 в значительной степени не имеют отношения к моим ответам выше).

  • 0
    Ваш ответ на 1) перекликается с моими предложениями в моем заключительном абзаце, поэтому я уже понял это. : о) Дай мне посмотреть, смогу ли я уточнить вопрос №2. Я конечно понимаю, как сделать исполняемый файл tcl. Мой вопрос заключается в том, можете ли вы внедрить индекс TCL в BASH (или файл PYTHON) и сделать этот встроенный скрипт вызываемым из внешних программ. Например, в моем случае мой гипотетический скрипт bash будет содержать индекс TCL. Затем я бы вызвал внешнюю программу (vmd) из сценария BASH, передав ей этот индекс в качестве аргумента. (Продолжение)
  • 0
    Использование отдельного сценария TCL разрушает всю мою предпосылку - сократить количество # сценариев с двух до одного универсального сценария. Что касается вашего ответа на вопрос № 3, основываясь на моем предыдущем чтении, если я правильно понял, интерфейс Typcl в Python был полезен только для интерпретации отдельных команд, тогда как Minotaur предлагает полный сценарий, который можно встроить. Следовательно, если бы я правильно понял, это НЕ было бы неуместно ... И ваш ответ все еще не проясняет, можете ли вы встроить скрипт и сделать вызов внешней программы в вашем скрипте python, передав эту внешнюю программу вашему встроенному скрипту.
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню