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?