2011-03-08 8 views
41

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

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

でもシェル自体では、 'which'自体は、コマンドがインストールされているかどうかを検出するための良い選択ではありません。 [参照](http://stackoverflow.com/questions/592620/check-if-a-program-exists-from-a-bash-script/677212#677212) – kojiro

答えて

61
+5

+1、これはクールで標準ライブラリの一部です!それはWindows上では非常に限られていることに注意してください.PATHEXTは解析されず、代わりに '.exe'拡張子(バッチファイルがありませんなど)を検索する必要があると仮定します。 – orip

+0

Google検索結果に完全に対応します。 –

+2

ファイルが実行可能かどうかはチェックしません。 – temoto

11

ありそれを行うためのコマンドはありませんが、あなたは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 

幸運を祈る!

+1

あなたはpathsep文字について前提を作ることに注意したい。 –

+0

とパス区切り記号ですが、これはポイントを作るためのちょっとした話です。がんばろう! –

+0

':'の代わりに '/'と 'os.pathsep'の代わりに' os.path.sep'を使います。 – djhaskin987

4

は、次のような何かを試みることができる:ツイスト実装を参照してください

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 
+0

'PATHEXT'も考慮する必要があります – orip

+1

Windowsマシンでは、拡張子を仮定するのではなく、ファイルの正確な名前を探すと思われます。そう言えば、PATHEXTのメンバーを反復する内部ループを追加することは難しくありません。 –

2

あなたがshell=Trueを使用する場合は、あなたのコマンドは、システムを介して実行されますシェルは自動的にパス上のバイナリを見つけます:

p = subprocess.Popen("abc", stdout=subprocess.PIPE, shell=True) 
+0

'shell = True'を指定しなくても、パス内で検索されますが、可能なコマンドがどれかを見つけたい場合は役に立ちません。 –

22

これは古い質問ですが、Python 3.3以降を使用している場合はshutil.which(cmd)を使用できます。文書hereがあります。標準ライブラリにあるという利点があります。

例はそうのようになる:

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

これはどのコマンドに相当し、これだけではないチェックファイルが存在する場合だけでなく、それが実行可能であるかどうか:

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 
関連する問題