'which' equivalent function in Python

為{幸葍}努か 提交于 2019-11-26 15:57:29

问题


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() on Python 2.4+

You will need to do: import distutils.spawn, or do from distutils import spawn

If you just do: import distutil, you won't be able to call 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:


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!




回答4:


(Similar question)

See the Twisted implementation: twisted.python.procutils.which




回答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'


来源:https://stackoverflow.com/questions/5226958/which-equivalent-function-in-python

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!