35

職場には、完了したタスクを一覧表示するスクリプトがあります。これは他の誰かによって書かれたもので、ネットワーク経由でホストされています。.bashrc には、このスクリプトを呼び出すエイリアスがあり、多くのフラグなどがあります。このエイリアスを数分ごとに呼び出す Python スクリプトを作成して、更新された統計でシェルを開くことができるようにしたいと考えました。ただし、subprocess.call("myAlias")失敗します。私はまだPythonにかなり慣れていないので、これを理解するのに苦労しています。

from subprocess import call

def callAlias():
    call("myAlias")

callAlias()

さらに追加する予定ですが、最初のステップで問題が発生しました。:P

もっと投稿したいのですが、気をつけなければならない機密情報がたくさんあります。あいまいなコードで申し訳ありませんが、エラー出力がありません。

4

4 に答える 4

84

更新:問題を回避するためのこのハックに賛成票を投じてくれてありがとう。しかし、はるかに良い答えはトリプルで、ページのはるか下で苦しんでいます...

必要なエイリアスが ~/.bashrc で定義されている場合、いくつかの理由で実行されません:

1) 'shell' キーワード引数を指定する必要があります。

subprocess.call('command', shell=True)

それ以外の場合、指定されたコマンドはシェルに渡されるのではなく、実行可能ファイルを見つけるために使用され、エイリアスや関数などを展開するのはシェルです。

2) デフォルトでは、subprocess.call とその仲間は「/bin/sh」シェルを使用します。これが呼び出したい Bash エイリアスである場合は、「実行可能」キーワード引数を使用して、サブプロセスに sh の代わりに bash を使用するように指示する必要があります。

subprocess.call('command', shell=True, executable='/bin/bash')

3) ただし、/bin/bash は ~/.bashrc を source しません (「-i」を使用して「対話型」シェルとして起動しない限り)。残念ながら、executable='/bin/bash -i' を渡すことはできません。値全体が実行可能ファイルの名前であると見なします。したがって、エイリアスがユーザーの通常の対話型スタートアップ (.bashrc など) で定義されている場合は、次の代替形式を使用してコマンドを呼び出す必要があります。

subprocess.call(['/bin/bash', '-i', '-c', command])
# i.e. shell=False (the default)
于 2014-08-02T22:03:01.123 に答える
22

shellキーワードをTrueに設定する必要があります。

call("myAlias", shell=True)

関連ドキュメントから:

の場合、指定されたコマンドshellTrueシェルを介して実行されます。これは、Pythonを主にほとんどのシステムシェルで提供する拡張制御フローに使用していて、ファイル名ワイルドカード、シェルパイプ、環境変数拡張などの他のシェル機能にアクセスしたい場合に便利です。

エイリアスはシェル機能です(たとえば、シェルによって定義および解釈されます)。

ただし、シェル(/ bin / sh)は非対話的に実行されるため、.profileファイル.bashrcは読み取られず、エイリアスは使用できない可能性があります。

完全に拡張されたコマンドをPythonスクリプトに使用することに抵抗がある場合は、$ENV環境変数を使用して、シェルにエイリアスが定義されたファイルを読み取らせる必要があります。

call("myAlias", shell=True, env=dict(ENV='/path/to/aliasfile'))
于 2012-08-21T18:28:36.633 に答える