2009-05-25 24 views
9

私はデフォルトのシェルとして/ bin/tcshを使用しています。os.system()コマンドを実行して、Linuxシェルを実行しますか?

しかし、tcshスタイルのコマンドos.system( 'setenv VAR val')は私にとっては機能しません。しかし、os.system( 'export VAR = val')は動作します。

私の質問は、どのシェルの下でos.system()コマンドを実行するのですか?

答えて

5

os.system()は、system()システムコール(「man 3 system」)を呼び出すだけです。ほとんどの* nixesでは、これはあなたが/bin/shを得ることを意味します。

export VAR=valは技術的には標準的な構文ではありません(bashは理解していますが、kshもそうです)。 /bin/shが実際にBourneシェルであるシステムでは動作しません。これらのシステムでは、別々のコマンドとしてエクスポートして設定する必要があります。 (これはbashでも動作します)

9

最近、os.system()の代わりにSubprocessモジュールを使用する必要があります。そこの文書によると、デフォルトシェルは/bin/shです。私はos.system()が同じように動作すると信じています。

編集:サブプロセスモジュールでは、実行プロセスで利用可能な環境をenvパラメータで設定できることにも言及しておきます。

+0

確かに、/ bin/sh(ほとんどの場合、bourneシェルの何らかの形です)は、ほとんどの場合、* nix関連のものが資格を持たない「シェル」と書かれているときの意味です。また、特定の非本土シェルの下でスニペットを実行する必要がある場合は、ここでtcshスニペットを "/ path/to/tcsh -c"のように渡すことができます。 –

2

コマンドがシェルファイルであり、ファイルが実行可能で、ファイルが "#!"で始まる場合は、シェルを選択できます。

#!/bin/zsh 
Do Some Stuff 

このファイルを書き込み、subprocess.Popen(filename,shell=True)でそれを実行し、あなたが望む任意のシェルを使用することができますすることができます。

また、thisos.systemsubprocess.Popenを必ず読んでください。

+0

私はshell = Trueが必要ではないことを指摘するつもりでしたが、それは私に起こりました。シバンを解釈してそれに応じて行動するシェルですか? –

+0

修正します。シェルは "マジック"バイト "#!"を解釈します。他のシェルが本当にこのファイルを使用すべきかを知ることができます。 –

10

ちょうどExecuting BASH from Python、次に17.1. subprocess — Subprocess management — Python v2.7.3 documentationを読み、executable引数を見ました。動作するようです:これは誰かに役立ちます

$ 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 

希望、
乾杯!

+0

私は誰かです。これは私が探していたものです。これに注目していただきありがとうございます:) – Thorn

+0

はい、1つのコマンドからsteoutを複数のコマンドにパイプするときは、 'command out = stdout | tee>(command_1 in = stdin)>(command_2 in = stdin) 'となります。これを投稿していただき、ありがとうございます〜 – CheeHow

関連する問題