当前位置:  开发笔记 > 编程语言 > 正文

如何在Python中判断文件在Windows上是否可执行?

如何解决《如何在Python中判断文件在Windows上是否可执行?》经验,为你挑选了0个好方法。

我正在编写grepath实用程序,找到%PATH%匹配模式的可执行文件.我需要定义路径中给定的文件名是否可执行(重点是命令行脚本).

基于"告诉文件是否可执行"我得到:

import os
from pywintypes import error
from win32api   import FindExecutable, GetLongPathName

def is_executable_win(path):
    try:
        _, executable = FindExecutable(path)
        ext = lambda p: os.path.splitext(p)[1].lower()
        if (ext(path) == ext(executable) # reject *.cmd~, *.bat~ cases
            and samefile(GetLongPathName(executable), path)):
            return True
        # path is a document with assoc. check whether it has extension
        # from %PATHEXT% 
        pathexts = os.environ.get('PATHEXT', '').split(os.pathsep)
        return any(ext(path) == e.lower() for e in pathexts)
    except error:
        return None # not an exe or a document with assoc.

在哪里samefile:

try: samefile = os.path.samefile
except AttributeError:    
    def samefile(path1, path2):
        rp = lambda p: os.path.realpath(os.path.normcase(p))
        return rp(path1) == rp(path2)

如何is_executable_win在给定的背景下进行改进?Win32 API的哪些功能可以提供帮助?

PS

时间表现无关紧要

subst 驱动器和UNC,unicode路径不在考虑之中

如果它使用Windows XP上提供的功能,则可以使用C++答案

例子

notepad.exe 是可执行的(作为规则)

which.py如果它与某些可执行文件(例如,python.exe)相关联并且.PY%PATHEXT%ie中,则'C:\> which'可以执行:

some\path\python.exe another\path\in\PATH\which.py

somefile.doc最可能不可执行(例如,当它与Word关联时)

another_file.txt执行的(通常为)

ack.pl如果它与某些可执行文件(最可能是perl.exe)相关联并且.PL处于可执行文件中(例如,如果它在路径中,则%PATHEXT%可以在ack不指定扩展名的情况下运行)是可执行的

这个问题中的"可执行文件"是什么

def is_executable_win_destructive(path):
    #NOTE: it assumes `path` <-> `barename` for the sake of example
    barename = os.path.splitext(os.path.basename(path))[0]
    p = Popen(barename, stdout=PIPE, stderr=PIPE, shell=True)
    stdout, stderr = p.communicate()
    return p.poll() != 1 or stdout != '' or stderr != error_message(barename)

哪里error_message()取决于语言.英文版是:

def error_message(barename):
    return "'%(barename)s' is not recognized as an internal" \
           " or external\r\ncommand, operable program or batch file.\r\n" \
           %  dict(barename=barename)

如果is_executable_win_destructive()返回时它定义路径是否指向可执行文件以用于此问题.

例:

>>> path = r"c:\docs\somefile.doc"
>>> barename = "somefile"

之后它执行%COMSPEC%(默认为cmd.exe):

c:\cwd> cmd.exe /c somefile

如果输出如下所示:

'somefile' is not recognized as an internal or external
command, operable program or batch file.

然后,path不是一个可执行否则它是(让我们假设有间的1对一一对应pathbarename例如起见).

另一个例子:

>>> path = r'c:\bin\grepath.py'
>>> barename = 'grepath'

如果.PY%PATHEXT%c:\bin%PATH%,则:

c:\docs> grepath
Usage:
  grepath.py [options] PATTERN
  grepath.py [options] -e PATTERN

grepath.py: error: incorrect number of arguments

以上输出不等于error_message(barename)因此'c:\bin\grepath.py'是"可执行".

所以问题是如何path在不实际运行的情况下找出是否会产生错误?什么Win32 API函数和用于触发'的条件不被识别为内部..'错误?

推荐阅读
k78283381
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有