IronPython,导入模块

3

我完全按照这里最好的答案的示例操作,使用Pyc.py进行编译。

构建Python脚本并从C#中调用方法

pyScope = pyEngine.ImportModule("MyClass");处出现异常。

no module named MyClass

我认为这是一个bug,因为有时使用Pyc.py重新编译会生成一个被ImportModule识别的dll,但有时则不行。
结论:如digEmAll所述,在此方式下使用Pyc.py编译模块会产生随机结果。应手动调用clr.CompileModules。
1个回答

8

好的,我明白了。

模块名称是原始.py模块的名称(区分大小写),而不是编译后的dll名称。

我的意思是,如果您的原始模块名称为myClass.py,然后您将其编译为MyClass.dll,您必须使用ImportModule("myClass")而不是ImportModule("MyClass")


编辑:

前面的代码是指以下编译方法:

import clr
clr.CompileModules("CompiledScript.dll", "script.py")

相反,使用 pyc.py,生成的dll包含一个名为 __main__ 的模块,而不是 .py 文件名。
这很奇怪...
我记得,在Python中,如果一个模块是独立运行的(即没有被其他模块调用),它会调用自己的名字叫做 __main__,但我仍然不理解其中的联系...

1
啊,要导入的模块仍然采用创建程序集的脚本名称,而不是程序集本身的名称。我可以确认这是真的。 - Jeff Mercado
谢谢,但这并没有解决问题,因为短语“MyClass”在我的项目中除了“MyClass”之外没有出现过。我认为Jeff M关于版本的评论是我下一个调查途径。您使用的IronPython和.NET的哪个版本?真希望能听到开发人员对此的看法。 - cory
尝试将您的.py文件重命名,但不要使用MyClass.py。无论如何,我已成功运行它,针对.NET 2.0/4.0,使用IronPython.dll 2.6.10920.0。 - digEmAll
在我的测试中,我创建了一个名为 Program.py 的脚本,并创建了一个名为 CompiledTest.dll 的程序集。使用给定的代码和适当的程序集名称更改,我遇到了你(@cory)遇到的问题。将模块导入的名称更改为 Program 可以解决这个问题。希望这回答了你的问题。 - Jeff Mercado
我重新开放这个问题,如果无法解决,我会在今天结束时提交一个错误报告。我的问题不是你所描述的那样。有时当我使用pyc.py编译时,生成的dll适用于ImportModule()。今天早上进行了简单的重新编译,结果这个错误又出现了,所以我觉得它似乎是随机的。 - cory
是的,使用pyc.py编译时我遇到了同样的问题。我已经编辑了相关问题... ;) - digEmAll

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接