2

我将 IronPython 嵌入到 C# 程序中。我知道我需要使用搜索路径列表调用 ScriptEngine.SetSearchPaths,以便我的 Python 代码可以导入模块。特别是我必须让它知道标准库模块在哪里,在我的例子中是:

C:\Program Files (x86)\IronPython 2.0.2\Lib

我的问题是,如何以编程方式找到该路径?

显然可以这样做,因为 IronPython 控制台知道它:

>>> import sys
>>> sys.path
['C:\\Windows\\system32', 'C:\\Program Files (x86)\\IronPython 2.0.2\\Lib', 'C:\\Program Files (x86)\\IronPython 2.0.2', 'C:\\Program Files (x86)\\IronPython 2.0.2\\lib\\site-packages'] 
4

4 回答 4

2

ipy.exe 根据启动进程的 EXE 计算此值:

Assembly entryAssembly = Assembly.GetEntryAssembly();
// Can be null if called from unmanaged code (VS integration scenario)
if (entryAssembly != null) {
    string entry = Path.GetDirectoryName(entryAssembly.Location);
    string lib = Path.Combine(entry, "Lib");
    ...

您也可以查看 IronPython.dll 的位置:

Assembly entryAssembly = typeof(Hosting.Python).Assembly;
于 2009-09-09T02:41:13.180 回答
2

一种可能的解决方案是随您的应用程序一起提供 Lib 文件夹的副本。我相信 IronPython 许可证(Microsoft Public License (Ms-PL))和 Python 许可证(Python License)都允许这样做。

该计划的好处:

  1. 应用程序很容易找到 Lib 文件夹。

  2. 安装会更容易,因为需要处理的安装程序将减少。

  3. 安装程序的总大小会更小。

  4. 如果应用程序使用的 IronPython 程序集是在本地复制的,那么复制 Lib 也是有意义的,这样两者就不会像使用 Program Files 中的 Lib 时那样不同步。

许可证似乎没有施加任何繁重的义务。Ms-PL 确实要求您在发行版中包含 Ms-PL 的完整副本,但这没什么大不了的。

编辑:这是代码

以下是我所做的。

Lib 文件夹被复制到我的 .csproj 文件的 AfterBuild 目标中。我不知道如何使用内置的 MSBuild 复制命令,因为与 MSBuild 相关的一切都被设计为最大程度地痛苦,所以我改用了 robocopy。(robocopy 是 xcopy 的替代品;您可以使用 xcopy 代替)。

<Target Name="AfterBuild">
  <Exec Command="robocopy $(ProjectDir)..\3rdParty\IronPython\IronPython2.0.2\Lib $(OutputPath)IronPython\Lib /E /XD .svn" IgnoreExitCode="true" />
  <Exec Command="copy $(ProjectDir)..\3rdParty\IronPython\IronPython2.0.2\license.* $(OutputPath)IronPython\" />
</Target>

它复制许可证文件(根据许可证的要求)并且不包括颠覆文件夹 (.svn)。

“3rdParty”文件夹位于我的 Visual Studio 解决方案的根级别。这是我保存第三方库的地方。

我忽略了 robocopy 的退出代码,因为<Exec>无法处理 robocopy 的退出代码。这并不理想,但我认为下一行中的普通副本会解决任何问题。

这就是我在代码中找到 Lib 路径的方式:

var assemblyPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
var libPath = Path.Combine(assemblyPath, @"IronPython\Lib");

要在单元测试中复制 Lib,请执行以下操作:

[TestMethod()]
[DeploymentItem(@"3rdParty\IronPython\IronPython2.0.2\Lib", @"IronPython\Lib")]
public void MyTest()
{
    // ...
于 2009-09-09T12:33:38.297 回答
1

尝试查看:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{80B8E2FB-A8AB-4CBF-836A-B43DE3B3C3F6}\InstallLocation

GUID 应该是相同的(我认为,至少对于相同版本的 IronPython),所以你应该没问题。这会给你安装目录,然后你可以追加@"\Lib"

于 2009-09-08T06:30:41.463 回答
0

创建一个环境变量,并从 IronPython 访问该环境变量。这应该是最直接的方法。

于 2011-08-17T15:57:03.813 回答