Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

PyCon 2011: IronPython Command Line

2,624 views

Published on

Writing command-line tools in IronPython inside of PowerShell.

  • Be the first to comment

PyCon 2011: IronPython Command Line

  1. 1. WRITING COMMAND-LINE TOOLS WITH IRONPYTHON AND VISUAL STUDIONoah Gift Including PowerShell, and F#
  2. 2. Talk Objectives¤  Freak you out a bit.¤  Teach you something you didn’t know. (Not covered in any book).¤  Be controversial.¤  Entertain you.
  3. 3. Monty Hall Problem¤  You are invited to a game show.¤  Game show host shows you three doors.¤  Behind two doors there is a goat, and behind one door is a $50,000 dollar sports car.
  4. 4. Monty Hall Problem¤  You choose a door.¤  Instead of opening your door. The game show host then opens up another door, to reveal a goat.¤  Do you switch your choice?
  5. 5. Monty Hall Problem¤  You always switch doors: 2/3 probability versus ½ probability.¤  Bayes Rule shows us this: (Think Spam classification).
  6. 6. Monty Hall Takeaway¤  This isn’t intuitive to most people¤  The human brain’s intuition is often broken.¤  What else is your brain wrong about?
  7. 7. Windows Is The Great Satan? ¤  Command-line is feeble ¤  People on twitter say it sucks ¤  Nothing COOL ever happens on Windows ¤  This isn’t “their” conference. ¤  What if your brain’s intuition is wrong about this too?
  8. 8. I Used To Hate Windows ¨  I Grew Up ¨  New Philosophy: Write Code in any language, in any environment. ¨  If it is innovative, I don’t care who made it. ¨  Sorry Stallman, we disagree.
  9. 9. What do most developers and adminsthink of when they hear Linux?¨  Power ¨  The Shell¨  Flexibility ¨  Command-tools¨  Bash ¨  Man Pages¨  SSH ¨  Awk/Sed
  10. 10. What Is The Unifying Theme Around This?¨  String Output is King ¨  Tim O’Reilly in Unix¨  Small Tools Power Tools, “A new¨  Flexibility user by stringing together simple¨  Geek Power. pipelines….”
  11. 11. The Hardest Part of Writing a *NixCommand-line tool in Python¨  Remote Administration: ¨  Religious war in your Pyro vs SSH vs ??? company over using¨  Dealing with *Nix tools optparse, getargs, that pass you back or argparse unstructured text.
  12. 12. Python/Unix Command-line Tools: TheEnd Game ¨  Remote Object Invocation (Pyro, SSH, Fabric) ¨  Security (SSH, SSL) ¨  Automation ¨  Application API ¨  Event Management (Pyro) ¨  Transactions (Mercurial?)
  13. 13. How To Write A Classic IronPython CLI¨  I needed to upgrade 100’s of thousands of lines of C# to .NET 4.0.¨  I wrote a quick and dirty Command-line tool in IronPython.
  14. 14. Project Upgrader: Validate Version  Step 1 def  validate_vsver(slnfile):          """Validates  whether  a  .sln  file  has  already  been  upgraded  to  VS  2010"""          try:                  project_file  =  open(slnfile)                  for  project_version_line  in  project_file.readlines():                          if  "Visual  Studio  2010"  in  project_version_line:                                  log.debug("Found  VS  2010  project  line:  %s"  %  project_version_line)                                  log.debug("Project  file  already  upgraded....skipping:  %s"  %  slnfile)                                  return  False                  return  True          finally:                  project_file.close()  
  15. 15. Project Upgrader: Walk A TreeStep 2 def  walk_tree(path,  extension="sln",   version_control_type=".svn",  exclude_path=None):          """Walks  a  tree,  if  there  is  a  match  to  an  extension,   it  returns  a  fullpath.                    Skips  version_control_type  directories,  which  by   default  is  set  to  .svn            """          for  dirpath,dirname,filename  in  os.walk(path):                  #The  walk  should  skip  version  control  directories                  for  dir  in  dirname:  
  16. 16. Project Upgrader: Convert Project  Step 3 def  convert_project(filename):          """Converts  a  project  to  VS2010  using  deven  via  .NET  Process   Class"""          p  =  Process()          p.StartInfo.UseShellExecute  =  False          p.StartInfo.RedirectStandardOutput  =  True          p.StartInfo.RedirectStandardError  =  True          p.StartInfo.FileName  =  """C:Program  Files  (x86)Microsoft   Visual  Studio  10.0Common7IDEdevenv.exe"""   print  "Stdout:  %s|  Stderr:  %s"  %  (stdout,  stderr)          p.WaitForExit()          return  p.ExitCode  
  17. 17. Project Upgrader: Convert Tree  Step 4 def  convert_tree(path,  exclude_path):          """Recursively  modifies  a  tree  of  sln  files,  if  they   havent  been  upgraded  to  VS  2010"""                    for  file  in  walk_tree(path,  exclude_path=exclude_path):                  if  not  validate_vsver(file):                          #we  should  pass  upgrading  if  validate_vsver   returns  False                          continue                  exit_code  =  convert_project(file)                  log.info("%s,  %s"  %  (exit_code,  file))  
  18. 18. Project Upgrader: Run method  Step 4  def  run(self):                  args,  parser  =  self.options()                  if  args.path:                          exclude  =  None                          if  args.exclude:                                  exclude  =  args.exclude                                  log.info("Exclude  set:  %s"  %  exclude)                          log.info("%s  Running  VS2010  upgrade  on  tree:  %s  |   excluding  dirs  named:  %s"  %  (time.ctime(),  args.path,  exclude))                          convert_tree(args.path,  exclude_path=exclude)                                  else:                          parser.print_help()
  19. 19. Python is like Kudzu ¤  Itsstrength is that it can embed itself into any project, any operating system. ¤  Not always the best tool, but often good enough.
  20. 20. Who Is The Target Audience ForCommand-line Tools? ¤  Systems Administrators ¤  Power Users ¤  Developers ¤  Systems Integrators/OEM ¤  Young Geeky Stallman
  21. 21. What Does It Really Mean To Write ACommand-line tool on Linux ¤  You have an executable that runs in the context of, most likely, Bash. ¤  You output a string, which you can then pipeline into our Unix tools, sed, awk, grep. ¤  If your nice you create –help
  22. 22. What Does It Really Mean To Write ACommand-line tool on Modern Windows ¤  Itis going to run inside of PowerShell. PowerShell is your bash. ¤  You have a unified interface to .NET and every possible high level automation API you can think of. ¤  PowerShell tools expect OBJECTS not strings.
  23. 23. PowerShell is Secure By Default ¤  Default File Association is Notepad or ISE. ¤  Remoting is disabled. ¤  No execution of scripts. ¤  Script Signing
  24. 24. Learning To Properly Write IronPythonCommand-Line Tools: “A two minute affair” ¤  Actually no, not even close. ¤  Forget “most” of what you know from linux. ¤  PowerShell changes everything.
  25. 25. PowerShell Object Passing Changes HowShells Work ¤  Fundamental change to understand ¤  You need to understand this to write command-line tools on Windows ¤  Game changer
  26. 26. We’re not in a flyover state anymore ¤  String output is lame! ¤  PowerShell wants objects ¤  What to do…what to do…
  27. 27. Fight the ecosystem and you will die ¤  Command-line tools should run in PowerShell not cmd.exe. ¤  The bash/linux CPython way, won’t cut it here. ¤  You must think the way .NET thinks. ¤  Everything takes and returns an Object.
  28. 28. PowerShell Endgame: We didEVERYTHING for you. ¤  Encrypted, paranoid secure, transactional, asynchronous remoting of serialized objects ¤  High level automation API to everything. ¤  Ignore at your own peril.
  29. 29. Writing a PowerShell Module In IronPython: The“real” way to write Command-line tools?¨  Create a New Visual Studio Project¨  Thinks Objects¨  Use PowerShell SDK¨  Write a Binary Module
  30. 30. Installing the PowerShell SDK¤  Download the SDK¤  Add a reference to the DLL in your Visual Studio Project¤ C:ProgramFiles (x86)Reference AssembliesMicrosoftWindowsPowerShell v1.0System.Management.Automation
  31. 31. Finding and Loading PowerShell Modules¨  Get-Module –all¨  When you create a .dll in IronPython, could then simply integrate it into the PowerShell workflow.
  32. 32. What is a Binary Module?¤  A .NET assembly compiled against PowerShell libraries.¨  For IronPython folks, this is one way to integrate into PowerShell¨  In a lot of documentation it will refer to C# code.¨  You can also write a PowerShell, non-compiled, module.
  33. 33. Creating a Binary Module For Powershell in IronPython¤  http://stackoverflow.com/questions/2094694/launch- powershell-under-net-4¤  You need to tweak some registry settings to support .NET 4.0 in PowerShell.
  34. 34. Creating a Binary Module For Powershell in IronPython: Continued¤  Should follow C# example code for best implementation advice.¤  Note, Argparse, Optparse, etc, aren’t used. They don’t make sense.¤  These are objects being passed into other cmdlets, and methods are being called on those objects.
  35. 35. IronPython PowerShell Module HelloWorldVisual Studio import  clr  Project: clr.AddReference(System.Management.Automation)   print  Hello  World  Step 1
  36. 36. IronPython PowerShell Module Hello WorldVisual Studio ¨  Build the project to create a .dllProject: ¨  In PowerShell Import ModuleStep 2 ¨  Import-Module MyModule.dll ¨  You can know interact with it from inside of .Net. Is this a commandline tool???
  37. 37. Setting Up A PowerShell Profile For IronPython¨  Just like in Bash or ZSH, aliases are your friend.¨  Edit your $profile with the ISE, and add interactive IronPython to it.
  38. 38. Creating Standalone IronPython executables¨  Make sure you can pass objects in and out of them.¨  Use the IronPython on codeplex: Pyc-Python Command-line compiler
  39. 39. F#: The Elephant in the Room ¤  Type inference ¤  Immutable data structures ¤  Run as script or compiled ¤  Tail recursion ¤  Fully integrated with Visual Studio ¤  Sexier then Python?
  40. 40. F# and Python: A Sexy Beast ¤  Mixing .dll files written in F# into IronPython modules, loaded into Powershell. ¤  Calling IronPython/CPython from inside of F# ¤  “A statically typed Python…” (Note, this will come up..just preparing you…)
  41. 41. Credit Some Excellent Books ThatReference PowerShell ¤  PowerShell in Action, Manning (The Bible) ¤  PowerShell Cookbook, O’Reilly ¤  IronPython in Action, Manning
  42. 42. Conclusion ¤  PowerShell isn’t a competing language, it IS THE ECOSYSTEM. ¤  Windows Systems Admins are using PowerShell for everything ¤  Get your head wrapped around object based pipelines. ¤  Why doesn’t Linux have this?
  43. 43. Questions? Code: https://bitbucket.org/noahgift/pycon2011- ironpython-cli

×