Linux中的IronPython DLL编译不适用于子文件夹中的模块

时间:2018-07-31 11:58:12

标签: ironpython

当源Python脚本的子目录中包含模块时,我无法解决从Linux中的Python文件创建IronPython DLL的问题。与Windows完全相同的版本可以正常工作。

我创建了一个简化的示例can be found here

该示例使用Docker快速启动Linux容器以在Linux中构建IronPython DLL。然后,我有一些通过LINQPad(请参阅RunCompiledRoutine.linq)运行的C#,它试图运行生成的IronPython DLL。这是失败的部分(当IronPython DLL是在Linux中构建时)。

要运行该示例,只需运行go.ps1脚本。

对不起,我知道要运行该示例,它需要同时安装Docker和LINQPad,因此我还将在下面进行说明...

我要构建的主要Python脚本源是TestScript.py文件,其中仅包含此文件...

import sys
import os

from TestSubDirectory.TestSubModule import TestSubModule

def main():
    TestSubModule().PrintMessage()

因此,没什么特别的-它只是将模块导入名为TestSubDirectory的目录中,而该模块看起来就像这样……

import sys
import os

class TestSubModule():
    def PrintMessage(self):
        print "*** SUCCESS ***"

因此,实际上只是在屏幕上打印一条消息。

然后在Linux容器中,我正在这样做以构建已编译的IronPython DLL ...

mono ./IronPython/ipy.exe ./CompileIntoDll.py

CompileIntoDll.py仅在clr.CompileModules("/app/CompiledPython.dll", mainModule = None, *files)处要包含要包含的文件列表。

这成功构建了IronPython DLL。但是,当我尝试从C#运行它(请参阅RunCompiledRoutine.linq)时,此操作将失败...

ImportException: cannot import TestSubModule from TestSubDirectory
    at IronPython.Runtime.Importer.ImportNestedModule(CodeContext context, PythonModule module, String[] parts, Int32 current, List path)
    at IronPython.Runtime.Importer.ImportModuleFrom(CodeContext context, Object from, String[] parts, Int32 current)
    at IronPython.Runtime.Importer.ImportModule(CodeContext context, Object globals, String modName, Boolean bottom, Int32 level)
    at IronPython.Modules.Builtin.__import__(CodeContext context, String name, Object globals, Object locals, Object fromlist, Int32 level)
    at Microsoft.Scripting.Interpreter.FuncCallInstruction`7.Run(InterpretedFrame frame)
    at Microsoft.Scripting.Interpreter.Interpreter.Run(InterpretedFrame frame)
    at Microsoft.Scripting.Interpreter.LightLambda.Run7[T0,T1,T2,T3,T4,T5,T6,TRet](T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6)
    at IronPython.Runtime.Importer.ImportLightThrow(CodeContext context, String fullName, PythonTuple from, Int32 level)
    at DLRCachedCode.TestScript$1(CodeContext $globalContext, FunctionCode $functionCode)
    at IronPython.Compiler.OnDiskScriptCode.Run()
    at IronPython.Compiler.OnDiskScriptCode.Run(Scope scope)
    at IronPython.Runtime.PythonContext.InitializeModule(String fileName, ModuleContext moduleContext, ScriptCode scriptCode, ModuleOptions options)
    at IronPython.Runtime.ModuleLoader.load_module(CodeContext context, String fullName)
    at Microsoft.Scripting.Interpreter.FuncCallInstruction`4.Run(InterpretedFrame frame)
    at Microsoft.Scripting.Interpreter.Interpreter.Run(InterpretedFrame frame)
    at Microsoft.Scripting.Interpreter.LightLambda.Run4[T0,T1,T2,T3,TRet](T0 arg0, T1 arg1, T2 arg2, T3 arg3)
    at System.Dynamic.UpdateDelegates.UpdateAndExecute3[T0,T1,T2,TRet](CallSite site, T0 arg0, T1 arg1, T2 arg2)
    at IronPython.Runtime.PythonContext.Call(CodeContext context, Object func, Object arg0)
    at IronPython.Runtime.Importer.FindAndLoadModuleFromImporter(CodeContext context, Object importer, String fullName, List path, Object& ret)
    at IronPython.Runtime.Importer.TryLoadMetaPathModule(CodeContext context, String fullName, List path, Object& ret)
    at IronPython.Runtime.Importer.ImportTopAbsolute(CodeContext context, String name)
    at IronPython.Runtime.Importer.ImportModule(CodeContext context, Object globals, String modName, Boolean bottom, Int32 level)
    at IronPython.Hosting.PythonService.ImportModule(ScriptEngine engine, String name)
    at IronPython.Hosting.Python.ImportModule(ScriptEngine engine, String moduleName)
    at UserQuery.Main(String[] args) in C:\Code\IronPythonLinuxIssue\RunCompiledRoutine.linq:line 12
    at LINQPad.ExecutionModel.ClrQueryRunner.Run()
    at LINQPad.ExecutionModel.Server.RunQuery(QueryRunner runner)

请注意,在Windows中构建DLL并在相同的LINQPad脚本中运行可以正常工作。我想知道从Linux运行时IronPython是否在某个地方不能正确处理路径分隔符(斜杠)。

如果我将TestSubModule.py与基本TestScript.py放在相同的文件夹中(即不使用子目录),则使用Linux构建 也可以正常工作。

请注意,这使用的是IronPython 2.7.8的.NET 4.5版本。我尝试使用.NET Core 2.0版本,但这不能说不支持clr.CompileModules

1 个答案:

答案 0 :(得分:0)

要回答我自己的问题-我也在GitHub issue上将此问题发布在IronPython GitHub上,事实证明他们没有处理不同的目录分隔符以在不同平台上工作-因此是DLL构建在Linux中无法在Windows中运行,反之亦然。

然而,实际上{em>当天,slozier是他们的主要贡献者之一,made a fix,它被合并为主人!我星期五回到办公室时将对此进行测试。