• Like
PyCon 2011:  IronPython Command Line
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

PyCon 2011: IronPython Command Line

  • 2,128 views
Published

Writing command-line tools in IronPython inside of PowerShell.

Writing command-line tools in IronPython inside of PowerShell.

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
2,128
On SlideShare
0
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
18
Comments
0
Likes
2

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. WRITING COMMAND-LINE TOOLS WITH IRONPYTHON AND VISUAL STUDIONoah Gift Including PowerShell, and F#
  • 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. 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. 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. Monty Hall Problem¤  You always switch doors: 2/3 probability versus ½ probability.¤  Bayes Rule shows us this: (Think Spam classification).
  • 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. 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. 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. What do most developers and adminsthink of when they hear Linux?¨  Power ¨  The Shell¨  Flexibility ¨  Command-tools¨  Bash ¨  Man Pages¨  SSH ¨  Awk/Sed
  • 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. Who Is The Target Audience ForCommand-line Tools? ¤  Systems Administrators ¤  Power Users ¤  Developers ¤  Systems Integrators/OEM ¤  Young Geeky Stallman
  • 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. 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. PowerShell is Secure By Default ¤  Default File Association is Notepad or ISE. ¤  Remoting is disabled. ¤  No execution of scripts. ¤  Script Signing
  • 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. 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. We’re not in a flyover state anymore ¤  String output is lame! ¤  PowerShell wants objects ¤  What to do…what to do…
  • 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. 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. 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. 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. 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. 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. 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. 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. IronPython PowerShell Module HelloWorldVisual Studio import  clr  Project: clr.AddReference(System.Management.Automation)   print  Hello  World  Step 1
  • 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. 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. 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. 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. 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. Credit Some Excellent Books ThatReference PowerShell ¤  PowerShell in Action, Manning (The Bible) ¤  PowerShell Cookbook, O’Reilly ¤  IronPython in Action, Manning
  • 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. Questions? Code: https://bitbucket.org/noahgift/pycon2011- ironpython-cli