如何从嵌入式引擎访问IronPython库目录?

如何从嵌入式引擎访问IronPython库目录?,ironpython,embedding,Ironpython,Embedding,我正在将IronPython嵌入C#程序中。我知道我需要使用搜索路径列表调用ScriptEngine.SetSearchPath,以便Python代码可以导入模块。特别是,我必须让它知道标准库模块在哪里,在我的例子中,这些模块在这里: C:\Program Files (x86)\IronPython 2.0.2\Lib 我的问题是,如何通过编程找到这条路径 这显然是可以做到的,因为IronPython控制台知道这一点: >>> import sys >>>

我正在将IronPython嵌入C#程序中。我知道我需要使用搜索路径列表调用ScriptEngine.SetSearchPath,以便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'] 
试试看:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{80B8E2FB-A8AB-4CBF-836A-B43DE3B3C3F6}\InstallLocation HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{80B8E2FB-A8AB-4CBF-836A-B43DE3B3C3F6}\InstallLocation
GUID应该是相同的(我认为,至少对于同一版本的IronPython来说是相同的),所以您应该可以使用它。这将为您提供安装目录,然后您只需附加
@“\Lib”

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;

一个可能的解决方案是将Lib文件夹的副本与应用程序一起提供。我相信IronPython许可证()和Python许可证()都会允许这样做

本计划的好处:

  • 应用程序将很容易找到Lib文件夹

  • 安装将更容易,因为将有一个较少的安装程序来处理

  • 安装程序的总大小将更小

  • 如果应用程序使用的IronPython程序集是本地复制的,那么也应该复制Lib,这样两者就不会像使用程序文件中的Lib时那样失去同步

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

    编辑:这是代码

    以下是我所做的

    Lib文件夹被复制到my.csproj文件的后生成目标中。我不知道如何使用内置的MSBuild copy命令,因为与MSBuild相关的所有操作都是为了最大限度地减轻痛苦而设计的,所以我改用了robocopy。(robocopy是xcopy的替代品;您可以使用xcopy代替)

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

    [TestMethod()]
    [DeploymentItem(@"3rdParty\IronPython\IronPython2.0.2\Lib", @"IronPython\Lib")]
    public void MyTest()
    {
        // ...
    

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

    我认为这行不通,因为IronPython程序集将位于我的应用程序文件夹中。这给了我一个想法。。。(我会写出来。)你是否建议OP在每次IronPython版本更改时都更改他的代码?
    var assemblyPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
    var libPath = Path.Combine(assemblyPath, @"IronPython\Lib");
    
    [TestMethod()]
    [DeploymentItem(@"3rdParty\IronPython\IronPython2.0.2\Lib", @"IronPython\Lib")]
    public void MyTest()
    {
        // ...