Welcome, guest | Sign In | My Account | Store | Cart
#!/usr/bin/env python
# -*- coding: utf8 -*-
__version__ = '$Id: which_dll.py 2247 2014-10-06 09:19:53Z mn $'

r"""
Returns the pathnames of the file (.exe or .dll)
which would be loaded/executed in the current environment
it uses some dirs from configuration (SystemDir, WindowsDir)
and dirs from PATH.

To obtain version info it uses code from:
http://pywin32.hg.sourceforge.net/hgweb/pywin32/pywin32/file/tip/win32/Demos/getfilever.py

Example of usage:
c:\tools\pyscripts\scripts>which_dll.py libpq.dll
2008-06-09 02:58:26	  167936 [b]	c:\postgresql\8.3\bin\libpq.dll	ver:8.3.3.8160
2008-03-17 01:47:50	  167936 [b]	c:\tools\libpq.dll	ver:8.3.1.8075
2008-03-17 01:47:50	  167936 [b]	g:\public\libpq.dll	ver:8.3.1.8075
	trying to load "libpq.dll" ...
	c:\postgresql\8.3\bin\libpq.dll loaded

Author: Michal Niklas
"""

USAGE = 'Usage:\n\twhich_dll.py dll_name/exe_name'

import sys
import time
import os
import os.path
import win32api


def get_file_ver(fname):
	# see: http://pywin32.hg.sourceforge.net/hgweb/pywin32/pywin32/file/tip/win32/Demos/getfilever.py
	result = []
	try:
		ver_strings = ('ProductVersion', 'FileVersion')
		pairs = win32api.GetFileVersionInfo(fname, '\\VarFileInfo\\Translation')
		## \VarFileInfo\Translation returns list of available (language, codepage) pairs that can be used to retreive string info
		## any other must be of the form \StringfileInfo\%04X%04X\parm_name, middle two are language/codepage pair returned from above
		for lang, codepage in pairs:
			#print 'lang: ', lang, 'codepage:', codepage
			for ver_string in ver_strings:
				str_info = u'\\StringFileInfo\\%04X%04X\\%s' % (lang, codepage, ver_string)
				result.append('%s %s' % (ver_string, win32api.GetFileVersionInfo(fname, str_info).strip()))
	except:
		pass
	return result


def get_file_info(file_path):
	"""returns string with file name, its modification time and size"""
	s = os.stat(file_path)
	f_date = time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime(s[8]))
	f_size = s[6]
	fv = ''
	ver_info = get_file_ver(file_path)
	if ver_info:
		fv = '\t%s' % ('; '.join(ver_info))
	return "%s\t%8s [b]\t%s%s" % (f_date, f_size, file_path, fv)


def which(fname):
	"""searches fname in PATH dirs"""
	if not which_file(fname):
		if '.' not in fname:
			# no extension, so we try some "executable" extensions
			for ext in ('.exe', '.com', '.bat', '.cmd'):
				fname2 = fname + ext
				if which_file(fname2):
					break


def which_file(fname):
	"""prints paths for fname where fname can be found,
	in case of .dll loads it"""
	files = []
	path = win32api.GetEnvironmentVariable('PATH')
	# try paths as described in MSDN
	dirs = [os.getcwd(), win32api.GetSystemDirectory(), win32api.GetWindowsDirectory()] + path.split(';')
	dirs_norm = []
	dirs_l = []
	for d in dirs:
		dn = d.lower()
		if dn not in dirs_l:
			dirs_l.append(dn)
			dirs_norm.append(d)
	for d in dirs_norm:
		fname2 = os.path.join(d, fname)
		if os.path.exists(fname2):
			if fname2 not in files:
				files.append(fname2)
	if files:
		print('\n'.join([get_file_info(f) for f in files]))
	h = 0
	if fname.lower().endswith('.dll'):
		print('\ttrying to load "%s" ...' % (fname))
		try:
			h = win32api.LoadLibrary(fname)
			if h:
				dll_name = win32api.GetModuleFileName(h)
				print('\t%s loaded' % (dll_name))
		except:
			print('\tCannot load "%s" !!!' % (fname))


def main():
	if '--version' in sys.argv:
		print(__version__)
		return
	elif '--help' in sys.argv:
		print(USAGE)
		return
	elif '--test' in sys.argv:
		which('libpq.dll')
		which('libeay32.dll')
		which('msvcr71.dll')
		which('ssleay32.dll')
		which('cmd.exe')
		which('grep')
		which('iclit09b.dll')
		which('non_existient.dll')
		return
	if len(sys.argv) < 2:
		print(USAGE)
	else:
		which(sys.argv[1])


main()

Diff to Previous Revision

--- revision 6 2009-07-01 02:19:19
+++ revision 7 2014-10-06 09:22:53
@@ -1,19 +1,15 @@
-#!/usr/bin/python
-# -*- coding: cp1250 -*-
-__version__ = '$Id: which_dll.py 516 2008-10-03 08:51:44Z mn $'
+#!/usr/bin/env python
+# -*- coding: utf8 -*-
+__version__ = '$Id: which_dll.py 2247 2014-10-06 09:19:53Z mn $'
 
-"""
+r"""
 Returns the pathnames of the file (.exe or .dll)
 which would be loaded/executed in the current environment
 it uses some dirs from configuration (SystemDir, WindowsDir)
 and dirs from PATH.
 
-It uses code from Python Cookbook recipe 67682 by Joshua W. Biagio from:
-http://code.activestate.com/recipes/67682/
-so it could also show version info. Simply:
--download it, 
--save as version.py in PYTHONPATH directory
--comment line "print 'No Version Information Available'"
+To obtain version info it uses code from:
+http://pywin32.hg.sourceforge.net/hgweb/pywin32/pywin32/file/tip/win32/Demos/getfilever.py
 
 Example of usage:
 c:\tools\pyscripts\scripts>which_dll.py libpq.dll
@@ -35,35 +31,40 @@
 import win32api
 
 
-VERCHECKER_ERR = 0
+def get_file_ver(fname):
+	# see: http://pywin32.hg.sourceforge.net/hgweb/pywin32/pywin32/file/tip/win32/Demos/getfilever.py
+	result = []
+	try:
+		ver_strings = ('ProductVersion', 'FileVersion')
+		pairs = win32api.GetFileVersionInfo(fname, '\\VarFileInfo\\Translation')
+		## \VarFileInfo\Translation returns list of available (language, codepage) pairs that can be used to retreive string info
+		## any other must be of the form \StringfileInfo\%04X%04X\parm_name, middle two are language/codepage pair returned from above
+		for lang, codepage in pairs:
+			#print 'lang: ', lang, 'codepage:', codepage
+			for ver_string in ver_strings:
+				str_info = u'\\StringFileInfo\\%04X%04X\\%s' % (lang, codepage, ver_string)
+				result.append('%s %s' % (ver_string, win32api.GetFileVersionInfo(fname, str_info).strip()))
+	except:
+		pass
+	return result
 
 
 def get_file_info(file_path):
 	"""returns string with file name, its modification time and size"""
-	global VERCHECKER_ERR
 	s = os.stat(file_path)
 	f_date = time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime(s[8]))
 	f_size = s[6]
 	fv = ''
-	try:
-		if VERCHECKER_ERR == 0:
-			import verchecker
-			try:
-				fv = '\tver:' + verchecker.calcversioninfo(file_path)
-			except:
-				pass
-	except:
-		if VERCHECKER_ERR == 0:
-			print "\tNo verchecker.py module! Look at: http://code.activestate.com/recipes/67682/"
-			VERCHECKER_ERR = 1
+	ver_info = get_file_ver(file_path)
+	if ver_info:
+		fv = '\t%s' % ('; '.join(ver_info))
 	return "%s\t%8s [b]\t%s%s" % (f_date, f_size, file_path, fv)
-
 
 
 def which(fname):
 	"""searches fname in PATH dirs"""
 	if not which_file(fname):
-		if not '.' in fname:
+		if '.' not in fname:
 			# no extension, so we try some "executable" extensions
 			for ext in ('.exe', '.com', '.bat', '.cmd'):
 				fname2 = fname + ext
@@ -78,31 +79,38 @@
 	path = win32api.GetEnvironmentVariable('PATH')
 	# try paths as described in MSDN
 	dirs = [os.getcwd(), win32api.GetSystemDirectory(), win32api.GetWindowsDirectory()] + path.split(';')
+	dirs_norm = []
+	dirs_l = []
 	for d in dirs:
+		dn = d.lower()
+		if dn not in dirs_l:
+			dirs_l.append(dn)
+			dirs_norm.append(d)
+	for d in dirs_norm:
 		fname2 = os.path.join(d, fname)
 		if os.path.exists(fname2):
-			if not fname2 in files:
+			if fname2 not in files:
 				files.append(fname2)
 	if files:
-		print '\n'.join([get_file_info(f) for f in files])
+		print('\n'.join([get_file_info(f) for f in files]))
 	h = 0
 	if fname.lower().endswith('.dll'):
-		print '\ttrying to load "%s" ...' % (fname)
+		print('\ttrying to load "%s" ...' % (fname))
 		try:
 			h = win32api.LoadLibrary(fname)
 			if h:
 				dll_name = win32api.GetModuleFileName(h)
-				print '\t%s loaded' % (dll_name)
+				print('\t%s loaded' % (dll_name))
 		except:
-			print '\tCannot load "%s" !!!' % (fname)
+			print('\tCannot load "%s" !!!' % (fname))
 
 
 def main():
 	if '--version' in sys.argv:
-		print __version__
+		print(__version__)
 		return
 	elif '--help' in sys.argv:
-		print USAGE
+		print(USAGE)
 		return
 	elif '--test' in sys.argv:
 		which('libpq.dll')
@@ -111,10 +119,11 @@
 		which('ssleay32.dll')
 		which('cmd.exe')
 		which('grep')
+		which('iclit09b.dll')
 		which('non_existient.dll')
 		return
 	if len(sys.argv) < 2:
-		print USAGE
+		print(USAGE)
 	else:
 		which(sys.argv[1])
 

History