如何在IronPython中使用标准库?

12 投票
3 回答
8284 浏览
提问于 2025-04-16 23:15

我先说一下:不,设置 IRONPYTHONPATH 不是解决办法。

好吧,继续...

我本来打算用 IronPython 来替代 Powershell 做一个项目,但在开始之前就遇到了麻烦。

我尝试的第一件事就是使用 os.path,结果出现了:

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

经过一番折腾,我终于发现可以通过手动将它添加到路径中来使用标准库:

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

不过,这个主意真是太傻了。在我的脚本里硬编码 Python 库的路径,肯定会在某个时候导致它们无法工作。

我几乎立刻就发现了这一点,因为我在一台 Windows 7 机器上使用这个脚本时,路径稍微有点不同(是 'Program Files (x86)')。

所以,这里有几个问题:

1) 为什么使用标准库这么难? 至少我以为在 VS 的交互式提示和基本的 ipy.exe 里应该有这个功能。

2) 我怎么能确定 IronPython 安装在哪个目录,不管我使用的是什么系统?(也许 IronPython 安装程序可以设置一个变量?)

顺便说一下;是的,我看到过一些帖子说“设置你的 IRONPYTHONPATH”。这没什么帮助。如果我有一台空白的机器,那就意味着我必须:

1) 安装 IronPython

2) 运行一些疯狂的 Powershell 脚本去找出标准库安装在哪里,并设置一个全局的 IRONPYTHONPATH 变量。

3) 运行 Python 脚本

我在寻找更好的方法。

--

编辑:

我用这个来做类似 Powershell 的事情其实没什么关系,但我想实现的目标是:

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 个回答

1

这真是奇怪,因为如果你安装了IronPython,然后运行 C:\Program Files\IronPython 2.7\ipy.exeC:\Program Files (x86)\IronPython 2.7\ipy.exe,你应该不需要做任何额外的操作就能使用标准库。

我猜可能是你安装了多个IronPython,而你运行的是错误的那个,但我实在想不出其他可能导致这种情况的原因。它应该是可以直接使用的。

1

这有点像变通的方法,不过考虑到在64位系统中,IronPython的LIB目录安装在x86程序文件夹下,而在32位系统中则在常规的程序文件路径下,你可以这样做:

import sys
import System
if System.IntPtr.Size * 8 == 32: # detect if we are running on 32bit process
    sys.path.append(System.Environment.GetEnvironmentVariable("ProgramFiles") + "\IronPython 2.7\Lib")
else:
    sys.path.append(System.Environment.GetEnvironmentVariable("ProgramFiles(x86)") + "\IronPython 2.7\Lib")

import os # it works !!

在这里,我们使用 %ProgramFiles%%ProgramFiles(x86)% 来确定IronPython的安装路径。

引用维基百科关于 %ProgramFiles% 变量的内容(链接):

%ProgramFiles%

这个变量指向程序文件目录,里面存放着所有安装的Windows程序和其他程序。在英语系统中,默认路径是C:\Program Files。在64位版本的Windows(如XP、2003、Vista)中,还有一个%ProgramFiles(x86)%,默认路径是C:\Program Files (x86),以及%ProgramW6432%,默认路径是C:\Program Files。%ProgramFiles%本身的值取决于请求这个环境变量的进程是32位还是64位(这是因为Windows在64位系统中会进行重定向)。

2

我发现,为了确保非开发人员的第三方也能正常使用,通常使用pyc.py来创建DLL和可执行文件会更好。我经常会把Python的标准模块做成一个DLL,然后在代码中引用它。你可以查看我在这个问题中的之前回答:IronPython: 用pyc.py编译的EXE无法导入模块"os"

撰写回答