バイナリへのパスを使用して環境をセットアップする必要があります。シェルではwhich、パスを見つけるために使用できます。Pythonに同等のものはありますか?これは私のコードです。
cmd = ["which","abc"]
p = subprocess.Popen(cmd, stdout=subprocess.PIPE)
res = p.stdout.readlines()
if len(res) == 0: return False
return True
バイナリへのパスを使用して環境をセットアップする必要があります。シェルではwhich、パスを見つけるために使用できます。Pythonに同等のものはありますか?これは私のコードです。
cmd = ["which","abc"]
p = subprocess.Popen(cmd, stdout=subprocess.PIPE)
res = p.stdout.readlines()
if len(res) == 0: return False
return True
回答:
PATH経由where.exe)が見つかりません。
import distutils.spawn最初に実行することを忘れないでください。
これを行うコマンドはありませんが、繰り返し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
幸運を!
os.path.sep代わりに/、のos.pathsep代わりに使用:
(同様の質問)
Twistedの実装を参照してください:twisted.python.procutils.which
次のようなことを試すことができます。
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
PATHEXTも考慮に入れる必要があります
を使用するとshell=True、コマンドはシステムシェルを介して実行され、パス上のバイナリが自動的に検出されます。
p = subprocess.Popen("abc", stdout=subprocess.PIPE, shell=True)
shell=Trueてもパスで検索されますが、可能なコマンドのどれが存在するかを見つけたい場合は役に立ちません。
これは、以前の回答の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'
TypeError: list object is not an iterator。
whichも、コマンドがインストールされているかどうかを検出するのに適していません。参考