How do you use the standard library in IronPython?

Viewed 7574

I'll prefix this question with: No, Setting IRONPYTHONPATH is not the answer.

Anyway...

I was planning on using IronPython as a replacement for Powershell for a project, but I've been stumped before I've even started.

The very first thing I tried to do was use os.path, resulting in:

Traceback (most recent call last):
  File "<string>", line 1, in <module>
ImportError: No module named os

After messing around I finally discovered I could use the standard library by adding it manually to the path:

import sys
sys.path.append(r"C:\Program Files\IronPython 2.7\Lib")
import os

However, this is a daft idea. Hard coding the path to the python library inside my scripts is a 100% guaranteed way of making them not work at some point.

I discovered this almost immediately when I tried to use the script on a windows 7 machine and the path was slightly different ('Program Files (x86)').

So, a couple of questions here:

1) Why is it so hard to use the standard library? At the very least I would have thought the interactive prompt in VS and basic ipy.exe would have this.

2) How can I determine the directory that iron python is installed in regardless of the system I'm using? (IronPython installer setting a var perhaps?)

Just a note here; yes, I have seen some other posts saying "set your IRONPYTHONPATH". This in unhelpful. If I have a blank machine that means I have to:

1) Install IronPython

2) Run some crazy powershell script to search out where-ever-the-heck the standard library was installed and set a global IRONPYTHONPATH variable to it.

3) Run python scripts

I'm looking for a better way.

--

Edit:

The fact I'm using this to do powershell like things is basically irrelevant, but I'm trying to achieve something like:

import clr
from System.Management.Automation import RunspaceInvoke
import os

scriptRoot = os.getcwd()
runSpace = RunspaceInvoke()
cmdPath64 = os.join(scriptRoot, "..\java\...")
cmdPath32 = os.join(scriptRoot, "..\java\...")
proc = runSpace.Invoke("Get-WmiObject Win32_Processor ... ")
if proc.AddressWidth == 32:
  runSpace.Invoke(cmdPath32)
else:
  runSpace.Invoke(cmdPath64)
3 Answers
Related