可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I need to setup environment by running which abc
command.
Is there a Python equivalent function of the which
command?
This is my code.
cmd = ["which","abc"]
p = subprocess.Popen(cmd, stdout=subprocess.PIPE)
res = p.stdout.readlines()
if len(res) == 0: return False
return True
回答1:
There is distutils.spawn.find_executable.
回答2:
I know this is an older question, but if you happen to be using Python 3.3+ you can use shutil.which(cmd)
. You can find the documentation here. It has the advantage of being in the standard library.
An example would be like so:
>>> import shutil
>>> shutil.which("bash")
'/usr/bin/bash'
回答3:
(Similar question)
See the Twisted implementation: twisted.python.procutils.which
回答4:
There's not a command to do that, but you can iterate over environ["PATH"]
and look if the file exists, which is actually what which
does.
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
Good luck!
回答5:
You could try something like the following:
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
回答6:
If you use shell=True
, then your command will be run through the system shell, which will automatically find the binary on the path:
p = subprocess.Popen("abc", stdout=subprocess.PIPE, shell=True)
回答7:
This is the equivalent of the which command, which not only checks if the file exists, but also whether it is executable:
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
回答8:
Here's a one-line version of earlier answers:
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)
used like so:
>>> which("ls")
'/bin/ls'