Like this presentation? Why not share!

# PyCon 2011: IronPython Command Line

## by Noah Gift, Head Of Web at Linden Lab on Mar 23, 2011

• 2,029 views

Writing command-line tools in IronPython inside of PowerShell.

Writing command-line tools in IronPython inside of PowerShell.

### Views

Total Views
2,029
Views on SlideShare
2,028
Embed Views
1

Likes
1
Downloads
12
Comments
0

### 1 Embed1

 http://www.linkedin.com 1

### Upload Details

Uploaded via SlideShare as Adobe PDF

### Usage Rights

© All Rights Reserved

### Report content

Edit your comment

## PyCon 2011: IronPython Command LinePresentation Transcript

• WRITING COMMAND-LINE TOOLS WITH IRONPYTHON AND VISUAL STUDIONoah Gift Including PowerShell, and F#
• Talk Objectives¤  Freak you out a bit.¤  Teach you something you didn’t know. (Not covered in any book).¤  Be controversial.¤  Entertain you.
• 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.
• 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?
• Monty Hall Problem¤  You always switch doors: 2/3 probability versus ½ probability.¤  Bayes Rule shows us this: (Think Spam classification).
• 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?
• 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?
• 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.
• What do most developers and adminsthink of when they hear Linux?¨  Power ¨  The Shell¨  Flexibility ¨  Command-tools¨  Bash ¨  Man Pages¨  SSH ¨  Awk/Sed
• 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….”
• 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.
• Python/Unix Command-line Tools: TheEnd Game ¨  Remote Object Invocation (Pyro, SSH, Fabric) ¨  Security (SSH, SSL) ¨  Automation ¨  Application API ¨  Event Management (Pyro) ¨  Transactions (Mercurial?)
• 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.
• 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()
• 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:
• 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
• 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))
• 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()
• 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.
• Who Is The Target Audience ForCommand-line Tools? ¤  Systems Administrators ¤  Power Users ¤  Developers ¤  Systems Integrators/OEM ¤  Young Geeky Stallman
• 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
• 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.
• PowerShell is Secure By Default ¤  Default File Association is Notepad or ISE. ¤  Remoting is disabled. ¤  No execution of scripts. ¤  Script Signing
• 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.
• PowerShell Object Passing Changes HowShells Work ¤  Fundamental change to understand ¤  You need to understand this to write command-line tools on Windows ¤  Game changer
• We’re not in a flyover state anymore ¤  String output is lame! ¤  PowerShell wants objects ¤  What to do…what to do…
• 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.
• 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.
• 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
• 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
• Finding and Loading PowerShell Modules¨  Get-Module –all¨  When you create a .dll in IronPython, could then simply integrate it into the PowerShell workflow.
• 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.
• 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.
• 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.
• IronPython PowerShell Module HelloWorldVisual Studio import  clr  Project: clr.AddReference(System.Management.Automation)   print  Hello  World  Step 1
• 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???
• 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.
• 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
• 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?
• 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…)
• Credit Some Excellent Books ThatReference PowerShell ¤  PowerShell in Action, Manning (The Bible) ¤  PowerShell Cookbook, O’Reilly ¤  IronPython in Action, Manning
• 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?
• Questions? Code: https://bitbucket.org/noahgift/pycon2011- ironpython-cli