2010-10-13 31 views
1

J'écris un script pour extraire quelques données utiles sur une série de simulations chimiques que j'ai exécutées.Pouvez-vous incorporer un script TCL dans un script Bash ou un script Python qui peut être appelé par des programmes externes?

Pour obtenir ces données j'ai besoin (1) d'un programme C qui calcule la densité à partir d'un type de fichier appelé *.pdb. J'ai déjà (1). Et (2) j'ai besoin d'utiliser un programme appelé vmd pour obtenir ce pdb. Pour accomplir (2) à partir de la ligne de commande, je peux soumettre un script tcl, car vmd a une construction dans l'interpréteur tcl.

Ces fonctions - appelez le vmd pour exécuter le script tcl, puis exécutez le programme c compilé - seront les activités clés de mon script d'extraction de données wrapper.

Je voudrais éliminer le script TCL superflue, en réduisant mon compte de 2 scripts (script wrapper + script tcl pour vmd) à 1. Mais je ne suis pas sûr de savoir comment faire. Une solution potentielle semble être d'intégrer mon script TCL dans mon script wrapper, s'il y a un moyen de rendre un tel script incorporé pouvant être appelé par des programmes externes. La plupart de mes scripts de collecte de données jusqu'à présent ont été dans BASH, donc idéalement, je voudrais m'en tenir à un script BASH car je suis très familier avec les scripts bash par rapport à la connaissance initiale de Python/Perl.

Voici mes questions:
1. Pouvez-vous intégrer un script TCL dans un script Bash?
Pouvez-vous rendre ce script appelable par un programme externe?
par exemple. en pseudocode:

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

3. Si la réponse à # 2 est pas, vous pouvez le faire en Python, peut-être avec la bibliothèque Minotaure? Je considère le passage à python, le cas échéant ...
http://markmail.org/message/6kogjphzqtn4ilch
4. Sinon, comment suggérez-vous d'essayer de fusionner ces deux scripts (une routine de tcl et un script bash qu'il appelle) en un seul fichier?
5. Si quelqu'un a reçu des appels externes de cette nature pour travailler avec Minotaur, pouvez-vous poster un code explicatif?

J'ai pensé à une solution non-intégrée à # 4, qui serait d'écrire une fonction dans mon script Bash qui écrit un fichier avec le script tcl entier. De cette façon, je n'aurais qu'un seul script, mais je pourrais sauvegarder l'indice pour l'utiliser avec des programmes externes, puis le supprimer. J'ai le sentiment que cette solution est un peu kludgy bien que je sache avec certitude que cela fonctionne, par rapport aux solutions intégrées.

+0

Tcl est inclus (bien que sous forme limitée) en Python. Voir http: //wiki.python.org/moin/Comment% 20Tkinter% 20can% 20exploit% 20Tcl/Tk% 20extensions –

+0

N'est-ce pas seulement pour TCL one-liners? Tous les exemples que j'ai vus étaient des commandes simples. Je voudrais intégrer un script continu entier, par ex. en guillemets "" "" "". C'est ce que j'ai préparé était possible avec minotaure. –

Répondre

4

Il y a eu plusieurs alliages Tcl-Python. Comme le commentaire de Rafe Kettler ci-dessus esquisse, l'endroit pour commencer est avec une installation standard de Python. Cela inclut Tkinter, qui construit dans un interpréteur Tcl complet, accessible comme décrit dans la page Wiki mentionnée. Donc, oui, il est possible de "faire ça en Python".

Je vraiment ne pas obtenir ce que cela a à voir avec VMD, cependant. vmd construit déjà dans un interpréteur Tcl. Bien que je soutiens entièrement l'objectif de "réduction des parties mobiles", de sorte que vous avez, par exemple, un script, plutôt que deux, codant quelque chose en Python, lorsque vmd expose déjà Tcl, ne semble pas une étape dans la direction Jason R. Mick veut y aller.

PLUS TARD ASSEZ: après un échange de commentaires avec Jason R. Mick, il me vint qu'il pourrait trouver

#!/bin/bash 


echo "Here's 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 

suggestif. Sa sortie, bien sûr, est

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

j'ai écrit ceci en termes de tclsh, mais, si je suis à suivre, Jason R. Mick voudra réellement utiliser VMD. Le * approprié pour homologue VMD est quelque chose comme

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

Alors que je peux penser à plusieurs autres façons de fusionner bash et Tcl, je crois que celui-ci est plus dans l'esprit de la question initiale.

Je veux noter, aussi, que, du peu que je connais VMD, il serait tout à fait approprié de faire la même chose avec Python en place de Tcl: VMD est tout aussi habile soit.

Enfin, à la fois Python et Tcl sont des langues à usage général, avec à peu près la même puissance que bash, donc encore une autre direction à prendre ce projet serait d'écrire entièrement en Tcl (ou Python), plutôt que bash . L'incorporation de scripts de la manière illustrée ci-dessus est au moins aussi facile dans Tcl (ou Python) que dans bash.

+0

Relisez la description de mon problème. Je veux intégrer un script tcl que je peux soumettre à un programme externe que j'appelle. Peu importe si le script est incorporé ou dans un fichier séparé, j'ai besoin de vmd pour exécuter ce script afin de générer mes données. Idéalement, je voudrais intégrer le script dans mon wrapper (script BASH), appeler vmd depuis mon wrapper, le remettre avec le script intégré, puis conclure en traitant les résultats dans mon script wrapper (en appelant mon programme c, etc.). avoir seulement (1) partie travaillante. Je ne pense pas que vous ayez compris la description de mon problème. –

+0

Vous avez oublié à la fin 'vmd -dispdev text -eofexit << HERE > output.log'. Postez une modification, s'il vous plaît quand vous le pouvez! Bien fait! –

1

1. Pouvez-vous incorporer un script TCL dans un script Bash?

Pas facilement. Le meilleur moyen est d'écrire le script dans un fichier temporaire et de passer le nom de ce fichier à tclsh (ou wish s'il s'agit d'un programme Tcl/Tk). Cela devrait être une "simple question de programmation", c'est-à-dire un codage maladroit mais pas fondamentalement difficile.

2. Pouvez-vous rendre ce script appelable par un programme externe?

Je ne comprends pas très bien ce que vous voulez faire ici. Vous pouvez mettre une ligne #! au début d'un script Tcl et marquer le fichier exécutable. Cela fonctionne bien. La meilleure façon de tout faire est this:

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

3. Si la réponse à # 2 est pas, vous pouvez le faire en Python?

mentionne quelque chose appelé Typcl, qui permet d'exécuter Tcl depuis Python. Je n'ai jamais essayé.

(je pense que les questions 4 et 5 sont en grande partie hors de propos en fonction de mes réponses ci-dessus.)

+0

Votre réponse à 1) fait écho à mes suggestions dans mon dernier paragraphe, alors j'avais déjà compris. : o) Laissez-moi voir si je peux clarifier à # 2. Je comprends bien sûr comment faire un tcl exécutable. Ma question est de savoir si vous pouvez EMBED un indice TCL à l'intérieur d'un BASH (ou un fichier PYTHON) et rendre ce script intégré appelable par des programmes externes. Par exemple, dans mon cas, mon script bash hypothétique contiendrait l'indice TCL. J'appellerais alors un programme externe (vmd) de WITHIN le script BASH, lui passant cet indice comme argument. (suite) –

+0

L'utilisation d'un script TCL séparé détruit toute ma prémisse - pour réduire mon nombre de scripts de deux à un seul script polyvalent. Quant à votre réponse à # 3, d'après mes lectures précédentes, si j'ai bien compris, l'interface Typcl en Python n'était utile que pour interpréter des commandes simples, alors que Minotaur offre un script complet qui peut être intégré. Par conséquent, si je comprenais correctement ce ne serait pas hors de propos ... Et votre réponse ne précise toujours pas si vous pouvez intégrer le script ET faire un appel à un programme externe dans votre script python, passant ce script externe. –

+0

@Jason: Vous pouvez envelopper les choses afin qu'elles construisent le script séparé à partir de son contenu (stocké dans le script shell) et l'écrit dans un fichier temporaire. La chose qui vous manque est un moyen pour tclsh de prendre un script depuis la ligne de commande via une sorte d'option '-e' (par analogie avec d'autres programmes); vous l'avez manqué parce que tclsh n'en a pas. –