如何在IronPython中使用标准库?
我先说一下:不,设置 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 个回答
这真是奇怪,因为如果你安装了IronPython,然后运行 C:\Program Files\IronPython 2.7\ipy.exe
或 C:\Program Files (x86)\IronPython 2.7\ipy.exe
,你应该不需要做任何额外的操作就能使用标准库。
我猜可能是你安装了多个IronPython,而你运行的是错误的那个,但我实在想不出其他可能导致这种情况的原因。它应该是可以直接使用的。
这有点像变通的方法,不过考虑到在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位系统中会进行重定向)。
我发现,为了确保非开发人员的第三方也能正常使用,通常使用pyc.py来创建DLL和可执行文件会更好。我经常会把Python的标准模块做成一个DLL,然后在代码中引用它。你可以查看我在这个问题中的之前回答:IronPython: 用pyc.py编译的EXE无法导入模块"os"