Showing posts with label Python. Show all posts
Showing posts with label Python. Show all posts

Friday, July 9, 2010

Python: Threading in Python

Problem Statement:
Demonstrate the usage of threading in python.

Scripts:
Let's consider an example where we have two scripts, one of them is the "main.py" script that can be considered as parent and the other that would run in threads "log.py".

Let's first take a look at
"log.py"
---------
import time

 class log:
  def __init__(self, times):
   self.times = times
   self._bOn = True

  def start(self):
   while (self._bOn):
    print "in start"
    time.sleep(self.times)


  def stop(self):
   self._bOn = False
   print "in stop"

log.py contains a class log with constructor that takes argument for time and sets the bOn variable to True.
start() - starts printing "in start" till the time bOn is True.
stop() - prints "in stop" when it is called. It would also stop the start() function as bOn is set to False now.

Now on to the parent script that would call log.py to run in thread.
"Main.py"
----------
import os
import log
import time
import thread

obj = log.log(5)

def startlog():
 print "in thread"
 obj.start()

thread.start_new_thread(startlog,())
time.sleep(11)
obj.stop()

Main.py, imports log.py with constructor argument as "5".
startlog() - prints "in thread" and then would call start() of log.py
startlog() is now run as a thread
Main script sleeps for 11 seconds and then
calls the stop() of log.py

Explanation:
In this example, when Main.py starts running, it imports log.py and sets the argument(time) of the constructor to 5. It then starts a thread for the function startlog() and goes to sleep for 11 seconds.
Now that a thread has started with startlog() function, it prints "in thread", then calls start() of log.py. Now that bOn is True, it prints "in start" and sleeps for 5 seconds as set by Main.py. After 5 seonds again it prints "in start".
During this time the Main.py is still sleeping. When 11 seconds pass by, Main.py comes out of sleep (log.py is still running though) and calls the stop() of log.py. Because of which, start() gets stopped as bOn is now set to False and it prints "in stop".
Thus we have seen, Main.py and log.py both ran in parallel and Main.py could control the execution of log.py as it was run in thread.

Sunday, June 27, 2010

Python: Making Objects Callable

Problem Statement: Have you ever wandered if we could make an object callable? Yes, I mean just use the object name as if you were calling function! Intersted?
Here's a simple solution!

Solution:
class Add:
#class for addition
 def __init__(self, num1, num2):
  self.num1 = num1
  self.num2 = num2
  print "Sum of", self.num1, "and", self.num2, "is:"

 def __call__(self):
  return (self.num1 + self.num2)

add = Add(1,2)
print add()

Output:
Sum of 1 and 2 is:
3

Explanation:
In this example, when 'add' is created using add = Add(1,2), def __init__() is called, since the constructor is called while object is getting created.
Because of the attribute __call__, the object becomes callable and hence we could use as add(). when add() is used, def __call__() is called.

Hope it's clear!

Friday, June 25, 2010

Python: Knowing the path of the currently running script

Problem Statement:

When we deal with frameworks, how often do we have to import modules. And it doesn't stop there; there arises a need where the imported would in turn import an another module, right? Would debugging an error condition be easy in these cases. If you have dealt with frameworks before, you would definitely understand the complexity of finding the fault location (exact module where the fault lies). Often people using logging mechanisms where they print to a file and start debugging. Wouldn't it be simple if we have a single line of code, just to tell which module is currently running? Was the first module being run when error occurred or was it the second module?

Solution:

Solution to this problem is fairly simple. Use of __file__ attribute in python.

__file__ attribute gets you information on the currently running script/module. Let's demonstrate this with an example. Consider, we have a parent script Main.py which imports a module called Module.py. Codes would like these:

Main.py

import Module

from Module import method

print "We're in %r" %__file__

Module.method()

Module.py

def method():

  import os

  f = open("C:\\sample.txt", "w")

  f.write('This is a sample file')

  print "We're in %r" %__file__

  f.close()

  os.system("del C:\\sample.txt")

Now, if we run the parent script Main.py, on command prompt, the output that we get is:

Output:

C:\Python26>Main.py

We're in 'C:\\Python26\\Main.py'
We're in 'C:\\Python26\\Module.py'

When the Main.py was running, __file__ gave us the path of current running script, but when the Module.py was imported and then __file__ was used, it gave the path of the module, and not the path of the parent script.

Utility:

- We can easily find the path of the current running script.

- Also we can easily find out which module is currently being run. This helps in easy debugging.

Monday, June 14, 2010

Python: MVC Pattern Example

Problem Statement: Demonstarte with example, Model-View-Controller Design pattern.

Script:
import sqlite3

class MVCModel:
def request(self, id):
# Would query database...
conn = sqlite3.connect('querydb')
c = conn.cursor()
results = c.execute('''select name from data where id = %d''' %id)
conn.commit()
c.close()
for row in results:
name = row[0]
return { "id" : id, "name": name}

class MVCController:
def __init__(self):
self.model = MVCModel()
self.view = MVCView()

def main(self):
post = self.model.request(1)
self.view.show(post)

class MVCView:
def show(self, post):
print "%(id)s %(name)s" % post

Controller = MVCController()
Controller.main()

Consistent to MVC Pattern,
the model runs a business logic that pings a database for an id and gets the corresponding name,
the controller accepts the request, sends it to the model, receives the return data from model and communicates to the view,
and the view represents the return data.

You could find a similar example on stackoverflow.

Wednesday, April 28, 2010

Python: Profiler

Problem Statement:
Profiling your python script.
A profiler is a program that monitors performance of a program during run time and provides a lot of information on the program.
Yes a module in Python that can do it easily for you!

Solution - Case Study:
Let's profile the Service class that I posted just before this blog.

Steps:
1. On the cmd prompt goto the Python installation directory.
2. Execute the command: python.exe -m cProfile Services.py

Output of the profiler:

907 function calls (893 primitive calls) in 0.105 CPU seconds

Ordered by: standard name

ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 0.000 0.000 :1()
1 0.000 0.000 0.000 0.000 :1(error)
1 0.000 0.000 0.000 0.000 :11(com_error)
1 0.000 0.000 0.000 0.000 :2(__init__)
1 0.000 0.000 0.000 0.000 CLSIDToClass.py:18()
1 0.000 0.000 0.000 0.000 CLSIDToClass.py:48(HasClass)
1 0.003 0.003 0.104 0.104 Services.py:1()
1 0.000 0.000 0.000 0.000 Services.py:8(Services)
1 0.000 0.000 0.000 0.000 __init__.py:116(CDispatch)
1 0.000 0.000 0.000 0.000 __init__.py:161(Constants)
1 0.000 0.000 0.000 0.000 __init__.py:164(__init__)
1 0.000 0.000 0.002 0.002 __init__.py:18(__WrapDispatch)
1 0.000 0.000 0.000 0.000 __init__.py:190(EventsProxy)
1 0.000 0.000 0.000 0.000 __init__.py:26(SetupEnvironment)
1 0.000 0.000 0.000 0.000 __init__.py:417(DispatchBaseClass)
1 0.000 0.000 0.035 0.035 __init__.py:46(GetObject)
1 0.000 0.000 0.000 0.000 __init__.py:493(CoClassBaseClass)
1 0.013 0.013 0.036 0.036 __init__.py:5()
1 0.000 0.000 0.035 0.035 __init__.py:83(Moniker)
1 0.002 0.002 0.022 0.022 __init__.py:9()
1 0.000 0.000 0.000 0.000 build.py:102(__init__)
1 0.003 0.003 0.003 0.003 build.py:11()
1 0.000 0.000 0.000 0.000 build.py:34(NotSupportedException)
1 0.000 0.000 0.000 0.000 build.py:388(VTableItem)
1 0.000 0.000 0.000 0.000 build.py:411(LazyDispatchItem)
1 0.000 0.000 0.000 0.000 build.py:413(__init__)
1 0.000 0.000 0.000 0.000 build.py:53(MapEntry)
1 0.000 0.000 0.000 0.000 build.py:84(OleItem)
1 0.000 0.000 0.000 0.000 build.py:87(__init__)
1 0.000 0.000 0.000 0.000 build.py:99(DispatchItem)
1 0.000 0.000 0.000 0.000 dynamic.py:110(Dispatch)
1 0.000 0.000 0.000 0.000 dynamic.py:131(MakeOleRepr)
1 0.000 0.000 0.000 0.000 dynamic.py:161(CDispatch)
1 0.000 0.000 0.000 0.000 dynamic.py:162(__init__)
1 0.009 0.009 0.012 0.012 dynamic.py:17()
1 0.000 0.000 0.000 0.000 dynamic.py:79(_GetGoodDispatch)
1 0.000 0.000 0.000 0.000 dynamic.py:90(_GetGoodDispatchAndUserName)
1 0.000 0.000 0.000 0.000 fnmatch.py:11()
1 0.000 0.000 0.000 0.000 gencache.py:165(GetClassForCLSID)
1 0.000 0.000 0.000 0.000 gencache.py:204(GetModuleForCLSID)
1 0.005 0.005 0.008 0.008 gencache.py:22()
1 0.000 0.000 0.000 0.000 gencache.py:53(__init__)
1 0.000 0.000 0.000 0.000 gencache.py:73(_LoadDicts)
1 0.001 0.001 0.002 0.002 glob.py:1()
1 0.000 0.000 0.000 0.000 keyword.py:11()
5 0.000 0.000 0.000 0.000 ntpath.py:116(splitdrive)
1 0.000 0.000 0.000 0.000 ntpath.py:267(isdir)
1 0.000 0.000 0.000 0.000 ntpath.py:439(normpath)
1 0.000 0.000 0.000 0.000 ntpath.py:495(abspath)
4 0.000 0.000 0.000 0.000 ntpath.py:51(isabs)
3 0.000 0.000 0.000 0.000 ntpath.py:59(join)
1 0.003 0.003 0.022 0.022 pythoncom.py:2()
1 0.000 0.000 0.003 0.003 pywintypes.py:2()
2 0.003 0.002 0.019 0.009 pywintypes.py:3(__import_pywin32_system_module__)
2 0.000 0.000 0.004 0.002 re.py:186(compile)
2 0.000 0.000 0.004 0.002 re.py:227(_compile)
2 0.000 0.000 0.000 0.000 sre_compile.py:184(_compile_charset)
2 0.000 0.000 0.000 0.000 sre_compile.py:213(_optimize_charset)
6 0.000 0.000 0.000 0.000 sre_compile.py:24(_identityfunction)
2 0.000 0.000 0.000 0.000 sre_compile.py:264(_mk_bitmap)
2 0.000 0.000 0.001 0.000 sre_compile.py:367(_compile_info)
6/2 0.000 0.000 0.001 0.000 sre_compile.py:38(_compile)
4 0.000 0.000 0.000 0.000 sre_compile.py:480(isstring)
2 0.000 0.000 0.002 0.001 sre_compile.py:486(_code)
2 0.000 0.000 0.004 0.002 sre_compile.py:501(compile)
4 0.000 0.000 0.000 0.000 sre_parse.py:132(__len__)
36 0.000 0.000 0.000 0.000 sre_parse.py:136(__getitem__)
46 0.000 0.000 0.000 0.000 sre_parse.py:144(append)
6/2 0.000 0.000 0.000 0.000 sre_parse.py:146(getwidth)
2 0.000 0.000 0.000 0.000 sre_parse.py:184(__init__)
58 0.000 0.000 0.001 0.000 sre_parse.py:188(__next)
12 0.000 0.000 0.000 0.000 sre_parse.py:201(match)
53 0.000 0.000 0.001 0.000 sre_parse.py:207(get)
3/2 0.000 0.000 0.002 0.001 sre_parse.py:307(_parse_sub)
5/2 0.000 0.000 0.002 0.001 sre_parse.py:385(_parse)
2 0.000 0.000 0.002 0.001 sre_parse.py:669(parse)
2 0.000 0.000 0.000 0.000 sre_parse.py:73(__init__)
1 0.000 0.000 0.000 0.000 sre_parse.py:78(opengroup)
1 0.000 0.000 0.000 0.000 sre_parse.py:89(closegroup)
6 0.000 0.000 0.000 0.000 sre_parse.py:96(__init__)
2 0.000 0.000 0.000 0.000 struct.py:35(_compile)
2 0.000 0.000 0.000 0.000 struct.py:54(pack)
2 0.000 0.000 0.000 0.000 struct.py:77(unpack)
1 0.000 0.000 0.000 0.000 traceback.py:1()
1 0.000 0.000 0.000 0.000 winerror.py:4()
1 0.000 0.000 0.000 0.000 wmi.py:101(SelfDeprecatingDict)
1 0.000 0.000 0.000 0.000 wmi.py:1143(_wmi_watcher)
1 0.000 0.000 0.000 0.000 wmi.py:138(ProvideConstants)
1 0.000 0.000 0.000 0.000 wmi.py:144(__init__)
4 0.000 0.000 0.000 0.000 wmi.py:149(__getattr__)
1 0.000 0.000 0.000 0.000 wmi.py:168(x_wmi)
1 0.000 0.000 0.000 0.000 wmi.py:183(x_wmi_invalid_query)
1 0.000 0.000 0.000 0.000 wmi.py:187(x_wmi_timed_out)
1 0.000 0.000 0.000 0.000 wmi.py:191(x_wmi_no_namespace)
1 0.000 0.000 0.000 0.000 wmi.py:197(x_access_denied)
1 0.000 0.000 0.000 0.000 wmi.py:201(x_wmi_authentication)
1 0.000 0.000 0.000 0.000 wmi.py:205(x_wmi_uninitialised_thread)
1 0.000 0.000 0.000 0.000 wmi.py:324(_wmi_method)
1 0.000 0.000 0.000 0.000 wmi.py:432(_wmi_property)
1 0.000 0.000 0.000 0.000 wmi.py:450(_wmi_object)
1 0.000 0.000 0.003 0.003 wmi.py:733(_wmi_event)
1 0.000 0.000 0.000 0.000 wmi.py:756(_wmi_class)
1 0.005 0.005 0.101 0.101 wmi.py:77()
1 0.000 0.000 0.000 0.000 wmi.py:870(_wmi_result)
1 0.000 0.000 0.000 0.000 wmi.py:886(_wmi_namespace)
2 0.000 0.000 0.000 0.000 wmi.py:91(signed_to_unsigned)
2 0.000 0.000 0.000 0.000 {_sre.compile}
2 0.000 0.000 0.000 0.000 {_win32sysloader.GetModuleFilename}
1 0.001 0.001 0.001 0.001 {_win32sysloader.LoadModule}
2 0.000 0.000 0.000 0.000 {built-in method load}
1 0.000 0.000 0.000 0.000 {cPickle.Unpickler}
2 0.000 0.000 0.000 0.000 {dir}
1 0.001 0.001 0.105 0.105 {execfile}
2 0.000 0.000 0.000 0.000 {getattr}
2 0.000 0.000 0.000 0.000 {globals}
4 0.000 0.000 0.000 0.000 {hasattr}
2 0.000 0.000 0.000 0.000 {imp.get_suffixes}
2 0.015 0.007 0.015 0.007 {imp.load_dynamic}
1 0.000 0.000 0.000 0.000 {imp.new_module}
7 0.000 0.000 0.000 0.000 {isinstance}
171/169 0.000 0.000 0.000 0.000 {len}
3 0.000 0.000 0.000 0.000 {max}
4 0.000 0.000 0.000 0.000 {method 'Bind' of 'PyITypeComp' objects}
1 0.000 0.000 0.000 0.000 {method 'BindToObject' of 'PyIMoniker' objects}
1 0.000 0.000 0.000 0.000 {method 'GetContainingTypeLib' of 'PyITypeInfo' objects}
2 0.000 0.000 0.000 0.000 {method 'GetTypeAttr' of 'PyITypeInfo' objects}
1 0.000 0.000 0.000 0.000 {method 'GetTypeComp' of 'PyITypeInfo' objects}
1 0.000 0.000 0.000 0.000 {method 'GetTypeComp' of 'PyITypeLib' objects}
2 0.001 0.001 0.001 0.001 {method 'GetTypeInfo' of 'PyIDispatch' objects}
230 0.000 0.000 0.000 0.000 {method 'append' of 'list' objects}
1 0.000 0.000 0.000 0.000 {method 'clear' of 'dict' objects}
1 0.000 0.000 0.000 0.000 {method 'close' of 'file' objects}
1 0.000 0.000 0.000 0.000 {method 'difference' of 'set' objects}
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
4 0.000 0.000 0.000 0.000 {method 'extend' of 'list' objects}
2 0.000 0.000 0.000 0.000 {method 'get' of 'dict' objects}
2 0.000 0.000 0.000 0.000 {method 'items' of 'dict' objects}
1 0.000 0.000 0.000 0.000 {method 'join' of 'str' objects}
1 0.000 0.000 0.000 0.000 {method 'lstrip' of 'str' objects}
1 0.000 0.000 0.000 0.000 {method 'remove' of 'list' objects}
1 0.000 0.000 0.000 0.000 {method 'replace' of 'str' objects}
1 0.000 0.000 0.000 0.000 {method 'split' of 'str' objects}
7 0.000 0.000 0.000 0.000 {method 'startswith' of 'str' objects}
2 0.000 0.000 0.000 0.000 {method 'unpack' of 'Struct' objects}
15 0.000 0.000 0.000 0.000 {min}
1 0.000 0.000 0.000 0.000 {nt._getfullpathname}
1 0.000 0.000 0.000 0.000 {nt.stat}
1 0.000 0.000 0.000 0.000 {open}
46 0.000 0.000 0.000 0.000 {ord}
1 0.033 0.033 0.033 0.033 {pythoncom.MkParseDisplayName}
1 0.000 0.000 0.000 0.000 {win32api.GetFullPathName}
1 0.000 0.000 0.000 0.000 {win32api.GetTempPath}
1 0.000 0.000 0.000 0.000 {win32api.RegOpenKey}


So many function calls for a class! Wow!

More information on the profiler here



Tuesday, April 27, 2010

Python: Service Class

Problem Statement:
Create a class for starting, stopping and getting status of a service.

Uses 2 methods:
- Windows Management Instrumentation
- SC Command from DOS

Solution:

import wmi
import os
import time
import string

class Services:
"""
1. The Service Class is aimed at starting and stopping the services based on the service name given as an input.
2. Class is instantiated with Service Name with the help of argumented constructor called __init__().
3. Function getstatus() gets the status of the services - Running or Stopped.
4. Functions start(),stop() would start and stop the services respectively by first getting the status of the service.
5. If the service is already started/stopped, it will print a message that the service is already running/stopped.
6. start() and stop() functions work in 2 modes: Using DOS command SC and using Windows Management Instrumentation. Default mode being "SC".
"""
def __init__(self, service):
self.wmiObj = wmi.WMI()
self.service = service
def getstatus(self):
return self.wmiObj.Win32_Service(Name=self.service)[0].State
def start(self, mode="sc"):
if mode.upper() == "SC":
try:
if(self.getstatus() == "Running"):
raise Exception("%s service is already running " % self.service)
else:
command = 'sc.exe start ' + self.service
os.system(command)
except Exception:
raise
if mode.upper() == "WMI":
try:
if self.getstatus()=="Running":
raise Exception("%s service is already running " % self.service)
else:
self.wmiObj.Win32_Service(Name=self.service)[0].StartService()
except Exception:
raise

def stop(self, mode="sc"):
if mode.upper() == "SC":
try:
if(self.getstatus() == "Stopped"):
raise Exception("%s service is already stopped " % self.service)
else:
command = 'sc.exe stop ' + self.service
os.system(command)
except Exception:
raise
if mode.upper() == "WMI":
try:
if self.getstatus()=="Stopped":
raise Exception("%s service is already stopped " % self.service)
else:
self.wmiObj.Win32_Service(Name=self.service)[0].StopService()
except Exception:
raise




Sunday, April 25, 2010

Python: Command Design Pattern

Hi Guys,

Recently I was working on learning design patterns in python. If you are not reading them , I highly recommend you to do so...they definitely help you in creating better designs or frameworks.

Here's something on Command Design Pattern:

class CommandPattern:
def __init__(self, cmd):
self.cmd = cmd
self._dict = { 'add' : 'add()', 'sub' : 'sub()' }
if self._dict.has_key(cmd):
call = self._dict[cmd]
call = "self." + call
eval(call)
else:
print "Invalid Command...."
def add(self):
print "In Add"
def sub(self):
print "In Sub"
cmdpattern = CommandPattern('add')

Explaination:
Command design pattern is seen as an example of encapsulation.

As per wikipedia, Three terms always associated with the command pattern are client, invoker and receiver. The client instantiates the command object and provides the information required to call the method at a later time. The invoker decides when the method should be called. The receiver is an instance of the class that contains the method's code.

In the above example, based on the command that is passed to the construtor of the class, the corresposnding function of the class is called and executed.

Python: VirtualMachine Handler

Problem Statement:
Create a Virtual Machine Handler class that supports,
- Start()
- Stop()
- TakeSnapshot()
- RevertSnapshot()

Solution:
import os
import time

class VirtualMCHandler:
"""
VirtualMCHandler class helps in managing Virtual Machines.
It has 4 functions that perform various operations on a VM.
Constructor: Takes the path of the Virtual Machine as its argument.
start() - Starts the Virtual Machine Image.
stop() - Stops the Virtual Machine Image.
takesnapshot(snapshotname) - Takes the Snaphot of Virtual Machine Image. Argument is the new snapshot name.
revertsnapshot(snapshotname) - Reverts the Virtual Machine Image to the previously taken snaphot name as mentioned in its argument.
"""


def __init__(self, VMPath):
self.path = "\"" + VMPath + "\""
def start(self):
_vmstart = "vmrun.exe -T ws start " + self.path + ""
os.system(_vmstart)

def stop(self):
_vmstop = "vmrun.exe -T ws stop " + self.path + ""
os.system(_vmstop)

def takesnapshot(self,snapshotname):
self.snapshotname = "\"" + snapshotname + "\""
_vmsnapshotname = "vmrun.exe -T ws snapshot " + self.path + " " + self.snapshotname
os.system(_vmsnapshotname)
def revertsnapshot(self,snapshotname):
self.snapshotname = "\"" + snapshotname + "\""
_vmrevert = "vmrun.exe -T ws revertToSnapshot " + self.path + " " + self.snapshotname
os.system(_vmrevert)

vm = VirtualMCHandler("E:\\Windows Server 2003 Enterprise Edition.vmx")
vm.start()
vm.takesnapshot("ARG")
vm.revertsnapshot("ARG")
vm.stop()

Note: You should have vmrun.exe in the path from where the script is run.
The script is tested for VMWare Workstation.

Python: SendKeys

Problem Statement:
Last week I faced an interesting problem t work. I was using runas DOS command using a Python script. After running the command, it asks you to enter a password on the cmd prompt. Now how do I do it with Python? Obvious answer was using subprocess functions (Popen and communicate). But have you tried something unconvenctional?

Solution:
SendKeys module could be the answer. Lets see how!
SendKeys is not available in Python 2.5 with default installation. One has to use that module by installing it.

Binary for the same could be obatainable from:

Here's the code that worked for me:

import SendKeys
import subprocess

password = "PASSWORD"
command = "runas /user:USERNAME Notepad.exe"
subprocess.Popen(command)

send = """
%s{ENTER}
""" % (password)

SendKeys.SendKeys(send)


For more better examples you could refer to:

Python: MD5/SHA Signature Class

Problem Statement:
Get a class to use it for calculatin signatures of file.

Solution Code:
class Hashes:
'''
Helps in retruning the foloowing signatures of a file:
md5()
sha1()
sha256()
sha512()
'''
def __init__(self, filepath):
self._filepath = filepath
def md5(self):
import md5
try:
fileobj = file(self._filepath, 'rb')
except Exception,msg:
raise
return md5.new(fileobj.read()).hexdigest()
def sha1(self):
import sha
try:
fileobj = file(self._filepath, 'rb')
except Exception,msg:
raise
return sha.new(fileobj.read()).hexdigest()
def sha512(self):
import hashlib
try:
fileobj = file(self._filepath, 'rb')
except Exception,msg:
raise
(hashlib.sha512()).update(fileobj.read())
return (hashlib.sha512()).hexdigest()
def sha256(self):
import hashlib
try:
fileobj = file(self._filepath, 'rb')
except Exception,msg:
raise
(hashlib.sha256()).update(fileobj.read())
return (hashlib.sha256()).hexdigest()

hash = Hashes("C:\\Windows\\system32\\notepad.exe")
hash.sha1()

Monday, April 12, 2010

Python: Load DLL

Hi guys,
Posting after a long time...but life had been busy and marriage really takes a toll on you. he he...jokes apart...
Meanwhile I have concentrated my energies on Python language. looks cool! Something in between Perl and C++ as I would like to put it.

Here's a small code that can show you the power of python:

Problem Statement:
What if you get a DLL file and you want to quickly test some of the exported APIs? Any ideas?

Solution:
Python provides you one.

Code snippet:
from ctypes import *
libc = windll.LoadLibrary('C:\\Windows\\System32\\kernel32.dll') #loads library
x = libc.GetModuleHandleA(None) #get the return type of GetModuleHandleA API
del libc #closes libc handler

In this code: we load kernel32.dll file and pass None argument to GetModuleHandleA function of the Dll.

Similarly you could customize this small code for your use.
Simple and quick!



Enjoy! Please do comment!