webdevqa.jp.net

Python:実行前にシェルコマンドの存在を確認してください

実行前にシェルコマンドの存在を確認する方法を見つけようとしています。

たとえば、コマンドack-grepを実行します。だから、私はやろうとしています:

サブプロセスのインポート
サブプロセスからインポートPIPE

[。 ../cgedit/ "]、stdout = PIPE、stderr = PIPE)

より、私が実行した場合

cmd_grep.stderr.read()

出力のように ''を受け取ります。しかし、パスにack-grepコマンドがありません。では、なぜPopenが.stderr変数にエラーメッセージを表示しないのですか?

また、私がやろうとしていることを行うためのより簡単な方法はありますか?

3

subprocess モジュールをPython 3またはcommandsmodule for Python 2 as follow:

ステータス、結果= subprocess.getstatusoutput( "ls -al")

ステータス、結果= commands.getstatusoutput( "ls -al")

次に、statusの値をテストします。

ウェブサイトからの例:

 >>> import subprocess 
 >>> subprocess.getstatusoutput( 'ls/bin/ls')
(0、 '/ bin/ls')
 >>> subprocess.getstatusoutput( 'cat/bin/junk')
(256、 'cat:/ bin/junk:そのようなファイルまたはディレクトリはありません')
 >>> subprocess.getstatusoutput( '/ bin/junk')
(256、 'sh:/ bin/junk:not found')
3
Studer

どういうわけか「which」コマンドを使用できませんでしたか? whichコマンドは、パス内のアプリケーションのルックアップを自動的に実行します。このコマンドを呼び出して、検索するコマンドの名前を渡して、結果を解析するだけでよいと思います。

2
djmc

このような状況では、次を使用します。

def find_program(prog_filename, error_on_missing=False):
    bdirs = ['$HOME/Environment/local/bin/',
             '$HOME/bin/',
             '/share/apps/bin/',
             '/usr/local/bin/',
             '/usr/bin/']
    paths_tried = []
    for d in bdirs:
        p = os.path.expandvars(os.path.join(d, prog_filename))
        paths_tried.append(p)
        if os.path.exists(p):
            return p
    if error_on_missing:
        raise Exception("*** ERROR: '%s' not found on:\n  %s\n" % (prog_filename, "\n  ".join(paths_tried)))
    else:
        return None

次に、次のようなことができます。

grep_path = find_program('ack_grep', False)
if grep_path is None:
    # default to standard system grep
    grep_path = 'grep'
1
Jeet

私はついにそれをこのように機能させたままにしました:

試してください:

    cmd_grep = ["ack-grep", "--no-color", "--max-count=1", "--no-group", function_definition, file_path]

    first_exec = Popen(cmd_grep,stdout=PIPE)

    execution = Popen(cmd_sed, Shell=True, stdin=first_exec.stdout, stdout=PIPE)

except:

    #use grep instead

    cmd_grep = cmd_grep = r'grep -R -n "' + function_definition + '" ' + file_path

    execution = Popen(cmd_grep + '|' + cmd_sed,Shell=True,stdout=PIPE)

output = execution.stdout.read()
0