我正在编写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对一一对应path
和barename
例如起见).
另一个例子:
>>> 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函数和用于触发'的条件不被识别为内部..'错误?