当源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
。
答案 0 :(得分:0)
要回答我自己的问题-我也在GitHub issue上将此问题发布在IronPython GitHub上,事实证明他们没有处理不同的目录分隔符以在不同平台上工作-因此是DLL构建在Linux中无法在Windows中运行,反之亦然。
然而,实际上{em>当天,slozier是他们的主要贡献者之一,made a fix,它被合并为主人!我星期五回到办公室时将对此进行测试。