Pythonスクリプトから(zsh)シェルプロンプトを取得したいと思います。ただ使用
import os
prompt = os.environ['PS1']
PS1
通常、子プロセスへの転送は行われないため、正しいアプローチではないようです。env | grep PS
シェルでも同じ方法で失敗します。
そこで、インタラクティブシェルをサブプロセスとして起動し、プロンプトを照会する必要があるという結論に達しました。シェルでできること
zsh -c -i 'echo $PS1'
(一重引用符でなければならず、二重引用符は失敗します。)
私はpython(2.7)で次のように同じことをしようとしていますsubprocess
。
print subprocess.check_output(['-i','-c',r"'echo $PS1'"],executable="/bin/zsh")
これは失敗しました
subprocess.CalledProcessError: Command '['-i', '-c', "'echo $PS1'"]' returned non-zero exit status 127
私はそれが原因だとは思わないが、$PS1
むしろecho-partをパラメータとして提供する方法のために、裸の文字列をこのようにエコーすることも失敗するからです。
行き来しながら様々な組み合わせを試みる
prompt = subprocess.check_output("""zsh -c -i 'echo $PS1'""",shell=True,executable="/bin/zsh")
これはアクションを実行しているようですが、これはシェルを起動してそのシェル内で別のシェルを呼び出すため、私にとっては間違っているようです-c -i 'echo $PS1'
。
シェルプロンプトを取得する正しい方法は何ですか?
ベストアンサー1
print subprocess.check_output(['zsh','-i','-c','echo $PS1'])
別のシェルで実行している場合は、文字列全体が単一引数として渡されるように、二重zsh
引用符が必要です。彼らはそうしなければならないecho $PS1
-c
一つ二重引用符内に最初のシェルが拡張されているため、引用符があります$PS1
。
Pythonでは、コマンド全体が単一の文字列なので、他の文字列のように引用されます。 2番目のグループを追加することは'echo $PS1'
(引用符を含む)を入力するのと同じですzsh
。シェルは名前付き実行ファイルを見つけますが、見つかりません'echo $PS1'
。