This document discusses writing command-line tools with IronPython and Visual Studio. It describes creating a Python CLI tool in IronPython to upgrade hundreds of thousands of lines of C# code to .NET 4.0. The tool uses functions to validate the Visual Studio version in solution files, walk a file tree to find solution files, convert projects to the VS2010 format using the devenv tool, and recursively modify solution files in the tree. The run method parses arguments and executes the conversion process on the specified path, excluding any directories matching the given path.
1. WRITING COMMAND-LINE
TOOLS WITH IRONPYTHON
AND VISUAL STUDIO
Noah 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 admins
think 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 *Nix
Command-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: The
End 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 Tree
Step 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
haven't
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))
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 For
Command-line Tools?
¤ Systems Administrators
¤ Power Users
¤ Developers
¤ Systems Integrators/OEM
¤ Young Geeky Stallman
21. What Does It Really Mean To Write A
Command-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 A
Command-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 IronPython
Command-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 How
Shells 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 did
EVERYTHING 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 Hello
World
Visual Studio import
clr
Project: clr.AddReference('System.Management.Automation')
print
'Hello
World'
Step 1
36. IronPython PowerShell Module Hello World
Visual Studio ¨ Build the project to create a .dll
Project:
¨ In PowerShell Import Module
Step 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 That
Reference 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?