在Python中,是否有一种可移植且简单的方法来测试是否存在可执行程序?

简单地说,我指的是类似于which的命令,这将是完美的.我不想手动搜索路径,也不想用Popen&艾尔,看看它是否失败(这就是我现在正在做的,但想象一下它是launchmissiles)

推荐答案

我能想到的最简单的方法是:

def which(program):
    import os
    def is_exe(fpath):
        return os.path.isfile(fpath) and os.access(fpath, os.X_OK)

    fpath, fname = os.path.split(program)
    if fpath:
        if is_exe(program):
            return program
    else:
        for path in os.environ["PATH"].split(os.pathsep):
            exe_file = os.path.join(path, program)
            if is_exe(exe_file):
                return exe_file

    return None

Edit:更新了代码示例,包括处理 case 的逻辑,其中提供的参数已经是可执行文件的完整路径,即"which/bin/ls".这模仿了UNIX"which"命令的行为.

Edit:更新为使用操作系统.路径isfile()而不是os.路径每个 comments 都存在().

Edit:path.strip('"')在这里似乎是不对的.Windows和POSIX似乎都不鼓励引用路径项.

Python相关问答推荐

为什么判断pd.DataFrame的值与判断pd.Series的值存在差异(如果索引中有值)?

将C struct 的指针传递给Python中的ioctel

将numpy数组与空数组相加

在Docker中运行HAProxy时无法获得503服务

具有多个组的条形图的不同y标度

"Discord机器人中缺少所需的位置参数ctx

如何将桌子刮成带有Se的筷子/要求/Beautiful Soup ?

按照行主要蛇扫描顺序对点列表进行排序

在Python中为变量的缺失值创建虚拟值

Python -根据另一个数据框中的列编辑和替换数据框中的列值

Django管理面板显示字段最大长度而不是字段名称

如何让剧作家等待Python中出现特定cookie(然后返回它)?

什么相当于pytorch中的numpy累积ufunc

用Python解密Java加密文件

为什么sys.exit()不能与subproccess.run()或subprocess.call()一起使用

Python键入协议默认值

为什么以这种方式调用pd.ExcelWriter会创建无效的文件格式或扩展名?

在极性中创建条件累积和

pandas在第1列的id,第2列的标题,第3列的值,第3列的值?

Django RawSQL注释字段