私はデフォルトのシェルとして/ bin/tcshを使用しています。os.system()コマンドを実行して、Linuxシェルを実行しますか?
しかし、tcshスタイルのコマンドos.system( 'setenv VAR val')は私にとっては機能しません。しかし、os.system( 'export VAR = val')は動作します。
私の質問は、どのシェルの下でos.system()コマンドを実行するのですか?
私はデフォルトのシェルとして/ bin/tcshを使用しています。os.system()コマンドを実行して、Linuxシェルを実行しますか?
しかし、tcshスタイルのコマンドos.system( 'setenv VAR val')は私にとっては機能しません。しかし、os.system( 'export VAR = val')は動作します。
私の質問は、どのシェルの下でos.system()コマンドを実行するのですか?
os.system()
は、system()
システムコール(「man 3 system
」)を呼び出すだけです。ほとんどの* nixesでは、これはあなたが/bin/sh
を得ることを意味します。
export VAR=val
は技術的には標準的な構文ではありません(bash
は理解していますが、ksh
もそうです)。 /bin/sh
が実際にBourneシェルであるシステムでは動作しません。これらのシステムでは、別々のコマンドとしてエクスポートして設定する必要があります。 (これはbash
でも動作します)
最近、os.system()
の代わりにSubprocessモジュールを使用する必要があります。そこの文書によると、デフォルトシェルは/bin/sh
です。私はos.system()
が同じように動作すると信じています。
編集:サブプロセスモジュールでは、実行プロセスで利用可能な環境をenv
パラメータで設定できることにも言及しておきます。
コマンドがシェルファイルであり、ファイルが実行可能で、ファイルが "#!"で始まる場合は、シェルを選択できます。
#!/bin/zsh
Do Some Stuff
このファイルを書き込み、subprocess.Popen(filename,shell=True)
でそれを実行し、あなたが望む任意のシェルを使用することができますすることができます。
また、this約os.system
とsubprocess.Popen
を必ず読んでください。
私はshell = Trueが必要ではないことを指摘するつもりでしたが、それは私に起こりました。シバンを解釈してそれに応じて行動するシェルですか? –
修正します。シェルは "マジック"バイト "#!"を解釈します。他のシェルが本当にこのファイルを使用すべきかを知ることができます。 –
ちょうど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
希望、
乾杯!
確かに、/ bin/sh(ほとんどの場合、bourneシェルの何らかの形です)は、ほとんどの場合、* nix関連のものが資格を持たない「シェル」と書かれているときの意味です。また、特定の非本土シェルの下でスニペットを実行する必要がある場合は、ここでtcshスニペットを "/ path/to/tcsh -c"のように渡すことができます。 –