2009-05-25 8 views
9

Używam/bin/tcsh jako mojej domyślnej powłoki.os.system() wykonać komendę pod którą powłoką Linuxa?

Jednak polecenie tcsh style os.system ("setenv VAR val") nie działa dla mnie. Ale os.system ("eksportuj VAR = val") działa.

Moje pytanie brzmi: jak mogę poznać polecenie uruchomienia os.system(), pod którego powłoką?

Odpowiedz

5

os.system() po prostu wywołuje wywołanie systemowe system() ("man 3 system"). W większości * nixes oznacza to, że otrzymujesz /bin/sh.

Zauważ, że export VAR=val jest technicznie nietypową składnią (chociaż bash to rozumie i myślę, że również ksh). Nie działa w systemach, w których /bin/sh jest w rzeczywistości powłoką Bourne'a. W tych systemach musisz wyeksportować i ustawić jako osobne polecenia. (Działa to również z bash).

9

W tych dniach powinieneś używać modułu Subprocess zamiast os.system(). Zgodnie z tamtejszą dokumentacją domyślną powłoką jest /bin/sh. Uważam, że os.system() działa w ten sam sposób.

Edycja: Powinienem również wspomnieć, że moduł podprocesu umożliwia ustawienie środowiska dostępnego dla procesu wykonywania za pomocą parametru env.

+0

Rzeczywiście,/bin/sh (co jest prawie zawsze jakąś formą powłoki Bourne'a) jest prawie zawsze tym, co rozumie się, gdy wszystko * związane z nix mówi "muszla" bez kwalifikacji. Warto również zauważyć, że jeśli naprawdę musisz wykonać jakiś fragment w określonej powłoce niebędącej miejscem bourne, możesz przekazać funkcję podobną do "/ path/to/tcsh -c" tu fragment tcsh "". –

2

Jeśli twoje polecenie jest plikiem powłoki, a plik jest wykonywalny, a plik zaczyna się od "#!", Możesz wybrać swoją powłokę.

#!/bin/zsh 
Do Some Stuff 

Można napisać ten plik, a następnie uruchom go z subprocess.Popen(filename,shell=True) i będziesz w stanie wykorzystać każdą muszlę chcesz.

Należy również przeczytać this o numerach os.system i subprocess.Popen.

+0

Chciałem wskazać, że shell = True nie jest konieczne, ale wtedy przyszło mi do głowy: czy to skorupa jest odpowiedzialna za interpretowanie shebangów i działanie zgodnie z nimi? –

+0

Prawidłowe. Powłoka interpretuje "magiczne" bajty "#!" aby zobaczyć, co inne powłoki naprawdę powinny używać tego pliku. –

10

Właśnie przeczytałem Executing BASH from Python, następnie 17.1. subprocess — Subprocess management — Python v2.7.3 documentation i zobaczyłem argument executable; i wydaje się działać:

$ 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 

Nadzieja pomaga to ktoś,
Cheers!

+0

Jestem tym kimś. Tego właśnie szukałem. Dziękujemy za zwrócenie uwagi :) – Thorn

+0

Tak, jest to prawdą, gdy jeden jest wypuszczany z jednego polecenia do wielu poleceń za pomocą tee, coś w stylu 'command out = stdout | tee> (command_1 in = stdin)> (command_2 in = stdin) '. Dzięki za zamieszczenie tego, kciuki w górę ~ – CheeHow

Powiązane problemy