【问题标题】:How do you use the standard library in IronPython?您如何使用 IronPython 中的标准库?
【发布时间】:2011-08-10 03:35:03
【问题描述】:

我会在这个问题前面加上:不,设置 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 库的路径进行硬编码是 100% 保证使它们在某些时候无法工作的方法。

当我尝试在 Windows 7 机器上使用该脚本并且路径略有不同(“Program Files (x86)”)时,我几乎立即发现了这一点。

所以,这里有几个问题:

1) 为什么使用标准库这么难?至少我会想到VS中的交互式提示和基本的ipy.exe会有这个。

2) 无论我使用的是什么系统,如何确定 Iron python 的安装目录?(IronPython 安装程序可能设置了一个 var?)

这里只是一个注释;是的,我看到其他一些帖子说“设置你的 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)

【问题讨论】:

  • 您能否展示一个示例脚本,说明您将尝试做什么以及打算如何使用它?我不确定我是否理解问题所在。
  • 见上面的编辑。不过,这基本上与我的问题无关。

标签: c# python ironpython


【解决方案1】:

我发现为了确保一切都适用于非开发人员第三方,通常最好使用 pyc.py 创建 DLL 和可执行文件。我经常创建 python 标准模块的 DLL 并在代码中引用它。在这个问题上查看我之前的回答IronPython: EXE compiled using pyc.py cannot import module "os"

【讨论】:

  • 这并不能完全回答我的问题,但它确实有效,而且它是迄今为止我找到的最佳解决方案。谢谢!
【解决方案2】:

这有点变通,但鉴于 Ironpython 的 LIB 目录安装在 64 位系统的 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% 变量(link):

%ProgramFiles%

此变量指向 Program Files 目录,该目录存储所有 Windows和其他的安装程序。默认开启 英语语言系统是 C:\Program Files。在 64 位版本中 Windows (XP, 2003, Vista), 还有 %ProgramFiles(x86)% 其中 默认为 C:\Program Files (x86) 和默认的 %ProgramW6432% 到 C:\Program 文件。 %ProgramFiles% 本身取决于 请求环境变量的进程本身是 32 位还是 64 位 (这是由 Windows-on-Windows 64 位重定向引起的)。

【讨论】:

  • 我已经使用 pyc.py 编译了我的脚本,但在执行过程中,我不断收到:未处理的异常:IronPython.Runtime.Exceptions.ImportException:没有名为 os 的模块。但是,一旦我添加了 sys.path.append(System.Environment.GetEnvironmentVariable("ProgramFiles(x86)") + "\IronPython 2.7\Lib") 它就起作用了!
【解决方案3】:

这很奇怪,因为如果您运行 IronPython 安装程序,然后运行 ​​C:\Program Files\IronPython 2.7\ipy.exeC:\Program Files (x86)\IronPython 2.7\ipy.exe,则无需执行任何操作即可使 stdlib 可用。

我的猜测是你有不止一个 IronPython 并且你运行了一个错误的,但这只是因为我想不出另一个会发生这种情况的原因。它应该只是工作。

【讨论】:

  • 我有同样的问题:如果我从包含“import os”行的 VS 2010 C# 项目中运行脚本,我会得到同样的错误;如果我手动添加 Lib 路径,它是固定的。项目参考中的 IronPython.dll 是 2.7。
  • 如果它有效,我会喜欢它。 :/(不,我没有多份铁蟒)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-04
  • 2011-02-02
  • 2017-02-17
  • 1970-01-01
  • 2023-03-13
  • 2015-11-01
相关资源
最近更新 更多