如何从嵌入式引擎进入IronPython Lib目录?

时间:2009-09-08 06:17:13

标签: ironpython embedding

我在一个C#程序中嵌入了IronPython。我知道我需要使用搜索路径列表调用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 个答案:

答案 0 :(得分: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;

答案 1 :(得分:2)

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

此计划的好处:

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

  2. 安装将更容易,因为将减少一个安装程序来处理。

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

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

  5. 许可证似乎没有施加任何繁重的义务。 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>
    

    它复制许可证文件(根据许可证的要求),它不包括subversion文件夹(.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()
    {
        // ...
    

答案 2 :(得分:1)

试着看看:

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

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

答案 3 :(得分:0)

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