web-dev-qa-db-ja.com

「=」で同等の関数「Python

which abcコマンドを実行して環境をセットアップする必要があります。 Python whichコマンドと同等の機能はありますか?これは私のコードです。

cmd = ["which","abc"]
p = subprocess.Popen(cmd, stdout=subprocess.PIPE)
res = p.stdout.readlines()
if len(res) == 0: return False
return True
62
prosseek
84
Rafael Reiter

これは古い質問ですが、たまたまPython 3.3+を使用している場合はshutil.which(cmd)を使用できます。ドキュメントを見つけることができます こちら =。標準ライブラリに含まれているという利点があります。

例は次のようになります。

>>> import shutil
>>> shutil.which("bash")
'/usr/bin/bash'
51
iLoveTux

同様の質問

Twistedの実装を参照してください: twisted.python.procutils.which

13
orip

それを行うコマンドはありませんが、environ["PATH"]を反復処理して、ファイルが存在するかどうかを確認できます。これは実際にwhichが行うことです。

import os

def which(file):
    for path in os.environ["PATH"].split(os.pathsep):
        if os.path.exists(os.path.join(path, file)):
                return os.path.join(path, file)

    return None

がんばろう!

12

次のようなものを試すことができます:

import os
import os.path
def which(filename):
    """docstring for which"""
    locations = os.environ.get("PATH").split(os.pathsep)
    candidates = []
    for location in locations:
        candidate = os.path.join(location, filename)
        if os.path.isfile(candidate):
            candidates.append(candidate)
    return candidates

Shell=Trueを使用すると、コマンドはシステムシェルを介して実行され、パス上のバイナリが自動的に検出されます。

p = subprocess.Popen("abc", stdout=subprocess.PIPE, Shell=True)
3
Greg Hewgill

これは、ファイルが存在するかどうかだけでなく、実行可能かどうかもチェックするwhichコマンドと同等です。

import os

def which(file_name):
    for path in os.environ["PATH"].split(os.pathsep):
        full_path = os.path.join(path, file_name)
        if os.path.exists(full_path) and os.access(full_path, os.X_OK):
            return full_path
    return None
3
o9000

以前の回答の1行版は次のとおりです。

import os
which = lambda y: next(filter(lambda x: os.path.isfile(x) and os.access(x,os.X_OK),[x+os.path.sep+y for x in os.getenv("PATH").split(os.pathsep)]),None)

次のように使用します:

>>> which("ls")
'/bin/ls'
0
Anonymous