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
distutils.spawn.find_executable()
on Python 2.4+
これは古い質問ですが、たまたまPython 3.3+を使用している場合はshutil.which(cmd)
を使用できます。ドキュメントを見つけることができます こちら =。標準ライブラリに含まれているという利点があります。
例は次のようになります。
>>> import shutil
>>> shutil.which("bash")
'/usr/bin/bash'
( 同様の質問 )
Twistedの実装を参照してください: twisted.python.procutils.which
それを行うコマンドはありませんが、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
がんばろう!
次のようなものを試すことができます:
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)
これは、ファイルが存在するかどうかだけでなく、実行可能かどうかもチェックする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
以前の回答の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'