2009-05-25 7 views
9

J'utilise/bin/tcsh comme shell par défaut. Cependant, la commande de style tcsh os.system ('setenv VAR val') ne fonctionne pas pour moi. Mais os.system ('export VAR = val') fonctionne. Donc, ma question est comment puis-je connaître la commande os.system() run sous quel shell?os.system() exécute la commande sous quel shell linux?

Répondre

5

os.system() appelle simplement l'appel système system() ("man 3 system"). Sur la plupart des * nix, cela signifie que vous obtenez /bin/sh.

Notez que export VAR=val est techniquement pas syntaxe standard (bien que bash le comprenne, et je pense que ksh aussi). Il ne fonctionnera pas sur les systèmes où /bin/sh est réellement le shell Bourne. Sur ces systèmes, vous devez exporter et définir des commandes séparées. (Cela fonctionnera également avec bash.)

9

De nos jours, vous devriez utiliser le module Subprocess au lieu de os.system(). Selon la documentation, le shell par défaut est /bin/sh. Je crois que os.system() fonctionne de la même manière.

Editer: Je dois également mentionner que le module de sous-processus vous permet de définir l'environnement disponible pour le processus d'exécution via le paramètre env.

+0

En effet,/bin/sh (qui est presque toujours une forme de shell bourne) est presque toujours ce que l'on entend quand quelque chose * nix-related dit "shell" sans qualification. Il peut également être utile de noter que si vous avez vraiment besoin d'exécuter un extrait sous un shell spécifique autre que bourne, vous pouvez passer la fonction quelque chose comme '/ path/to/tcsh -c' votre extrait tcsh ici ''. –

2

Si votre commande est un fichier shell et que le fichier est exécutable, et que le fichier commence par "#!", Vous pouvez choisir votre shell.

#!/bin/zsh 
Do Some Stuff 

Vous pouvez écrire ce fichier, puis l'exécuter avec subprocess.Popen(filename,shell=True) et vous serez en mesure d'utiliser un shell que vous voulez.

En outre, veillez à lire this environ os.system et subprocess.Popen.

+0

J'allais faire remarquer que shell = True n'est pas nécessaire, mais alors il m'est apparu: est-ce le shell qui est responsable de l'interprétation des shebangs et qui agit en conséquence? –

+0

Correct. Le shell interprète les "magic" octets "#!" pour voir quel autre shell devrait vraiment utiliser ce fichier. –

10

Était en train de lire Executing BASH from Python, puis 17.1. subprocess — Subprocess management — Python v2.7.3 documentation, et j'ai vu l'argument executable; et il semble fonctionner:

$ python 
Python 2.7.1+ (r271:86832, Sep 27 2012, 21:16:52) 
[GCC 4.5.2] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import os 
>>> print os.popen("echo $0").read() 
sh 
>>> import subprocess 
>>> print subprocess.call("echo $0", shell=True).read() 
/bin/sh 
>>> print subprocess.Popen("echo $0", stdout=subprocess.PIPE, shell=True).stdout.read() 
/bin/sh 
>>> print subprocess.Popen("echo $0", stdout=subprocess.PIPE, shell=True, executable="/bin/bash").stdout.read() 
/bin/bash 
>>> print subprocess.Popen("cat <(echo TEST)", stdout=subprocess.PIPE, shell=True).stdout.read() 
/bin/sh: Syntax error: "(" unexpected 
>>> print subprocess.Popen("cat <(echo TEST)", stdout=subprocess.PIPE, shell=True, executable="/bin/bash").stdout.read() 
TEST 

Hope this helps quelqu'un,
Cheers!

+0

Je suis cette personne. C'est ce que je cherchais. Merci d'avoir noté ceci :) – Thorn

+0

Oui, ceci est tellement vrai quand on passe de stdout d'une simple commande à plusieurs commandes en utilisant tee, quelque chose comme 'command out = stdout | tee> (commande_1 in = stdin)> (commande_2 in = stdin) '. Merci d'avoir posté ceci, bravo ~ – CheeHow

Questions connexes