2009-02-10 10 views
4

Sans utiliser le nouveau module de sous-processus 2.6, comment puis-je obtenir os.popen ou os.system pour exécuter mes commandes en utilisant le tcsh au lieu de bash? J'ai besoin de sources de scripts qui sont écrits dans tcsh avant d'exécuter d'autres commandes et je dois le faire dans python2.4.En python 2.4, comment puis-je exécuter des commandes externes avec csh au lieu de bash?

EDIT Merci pour les réponses en utilisant 'tcsh -c', mais je voudrais éviter cela parce que je dois échapper à la folie. La chaîne sera interprétée par bash puis interprétée par tcsh. Je vais devoir faire quelque chose comme:

os.system("tcsh -c '"+re.compile("'").sub(r"""'"'"'""",my_cmd)+"'") 

je ne peux pas simplement dire python d'ouvrir un « tcsh » subprocess au lieu d'un sous-processus « bash »? Est-ce possible?

P.S. Je me rends compte que bash est le miaulement du chat, mais je travaille dans un environnement d'entreprise et je vais choisir de pas combattre un tcsh vs bash bataille - plus gros poisson à frire.

+0

Qu'entendez-vous par "source"? – hop

+0

Si vous exécutez une commande comme 'source env_mod.csh', le script modifiera votre shell actuel. Si vous faites 'tcsh -f env_mod.csh', le script shell créera un shell enfant qui héritera des variables d'environnement de votre shell actuel et s'exécutera sans modifier le shell parent. –

+0

Exemple inclut votre fichier ~/.bashrc qui est 'source' lorsque vous démarrez un nouveau shell bash. –

Répondre

-1

os.system() appels system(3) directement, et cet appel système est celui qui « choisit " La coquille. Je mets cela entre guillemets, car system(3) exécutera toujours /bin/sh.

Ainsi, si vous voulez Python d'utiliser un autre shell, vous avez plusieurs options:

  • Modifier le lien symbolique /bin/sh pour pointer vers tcsh. Cela aura un effet sur l'ensemble du système, ce qui ne devrait pas poser de problème puisque les scripts qui ont besoin de fonctionnalités bash devraient commencer par /bin/bash de toute façon. Exécutez votre script Python à partir d'un environnement chroot/bin/sh pointe sur tcsh.

  • Remplacer /bin/sh avec un script qui exécute bash ou tcsh en fonction de qui l'appelle (vous pouvez, par exemple, passer une variable d'environnement supplémentaire.)

  • tout Mettez à exécuter dans tcsh dans un document distinct script shell et appelez cela avec os.system('tcsh -c...'). De cette façon, vous n'avez pas à échapper à quoi que ce soit.

+2

Messing avec/bin/sh est un problème invitant. Je ne pourrais pas le recommander. –

5

Que diriez-vous:

>>> os.system("tcsh your_own_script") 

Ou il suffit d'écrire le script et ajouter

#!/bin/tcsh 

au début du fichier et laissez le système d'exploitation prendre soin de cela.

11

Juste préfixe le shell dans le cadre de votre commande. Je n'ai pas tcsh mais avec zsh:

>>> os.system ("zsh -c 'echo $0'") 
zsh 
0 
-1

mis en place l'enveloppe à utiliser pour être tcsh:

>>> os.environ['SHELL'] = 'tcsh' 
>>> os.environ['SHELL'] 
'tcsh' 
>>> os.system("echo $SHELL") 
tcsh 
+0

ne fonctionne pas: % bash bash-3.00 $ echo $ SHELL tcsh bash-3.00 $ >>> import os >>> print os.environ [ 'SHELL'] tcsh >>> –

+0

de toute façon, le shell que os.system exécute est bash même si vous définissez $ SHELL à tcsh –

+0

nice try ... mais shell ne se conforme pas à la dactylographie – hop

Questions connexes