【问题标题】:How to get to the IronPython Lib directory from embedded engine?如何从嵌入式引擎进入 IronPython Lib 目录?
【发布时间】:2009-09-08 06:17:13
【问题描述】:

我将 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'] 

【问题讨论】:

    标签: ironpython embedding


    【解决方案1】:

    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;
    

    【讨论】:

    • 我认为这不会起作用,因为 IronPython 程序集将存在于我的应用程序文件夹中。不过这给了我一个想法……(我会写下来。)
    【解决方案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 的退出代码,因为 &lt;Exec&gt; 无法处理 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()
    {
        // ...
    

    【讨论】:

      【解决方案3】:

      试试看:

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

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

      【讨论】:

      • 您是否建议 OP 每次 IronPython 的版本更改时都更改他的代码?
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-02
        • 2019-11-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多