【问题标题】:Python CLR Module with C# DLLs - AddReference works, import doesn't带有 C# DLL 的 Python CLR 模块 - AddReference 有效,导入无效
【发布时间】:2017-12-15 13:06:44
【问题描述】:

这个问题与我无法分享的敏感数据有关,但问题很简单。我正在开发 PyCharm 2017.1.2、python 2.7.13。

我有一个特定格式的文件(一种加密的 XML,无法解析),需要将其转换为 Excel 以修改某些值,然后将其导出回原始格式。出于某些安全原因,我无法绕过这种转换。很好,我有一个 Excel 加载项,我可以在两个 C# DLL 中使用它,它可以“导入”到 Excel 格式并将其“导出”回奇怪的 XML。

我也不能使用 IronPython,因为我正在设计的软件使用库 IronPython 无法管理,所以我坚持使用旧的 Python 2.7。

我目前正在使用来自 pythonnet 的 clr 模块将 DLL 导入我的软件。导入代码(不明智)如下所示:

import clr
import sys

sys.path.append('C:/My/Path/To/The/DLLs/Folder')
clr.AddReference('Microsoft.Office.Interop.Excel, Version=11.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c')
clr.AddReference('My.ClassLib.DLL')
clr.AddReference('My.ExcelImportExport.DLL')

import Microsoft.Office.Interop.Excel as Excel
try:
    from My.ClassLib.DLL import XMLParser
    import My.ExcelImportExport.DLL
    from My.ExcelImportExport.DLL import DeviceSettingsUtility
except Exception, e:
    print unicode(e)

我正在使用的两个 DLL 都位于同一个文件夹中。 CLR 添加 DLL 引用没有问题。

奇怪的是:'My.ClassLib.DLL' 一切正常:我可以毫无问题地访问它的类和方法。 但是,一旦我尝试import My.ExcelImportExport.DLL 或之后的行,我就有了ImportError: No module named My.ExcelImportExport.DLL。当使用 clr 添加引用后,我列出所有程序集时,我同时看到 My.ClassLib.DLLMy.ExcelImportExport.DLL,所以问题不来自这里。问题来自My.ExcelImportExport.DLL

我用反编译器查看了这两个 DLL,但没有发现任何使 ClassLib.DLL 工作的东西,并解释了为什么另一个不工作。

最后,我的问题是:DLL(C# 代码)中需要什么才能让 clr 能够导入它?

【问题讨论】:

  • 请查看此维基页面:github.com/pythonnet/pythonnet/wiki/…
  • 您的 .NET 类实际上是否命名为“DLL”?通常,在添加对 DLL 的引用后,而不是 from My.ExcelImportExport.DLL import DeviceSettingsUtility,我希望看到类似 from My.ExcelImportExport import DeviceSettingsUtility 的内容。
  • 我也有同样的问题。 pythonnet/wiki 页面似乎没有帮助。还有一点需要注意: clr.__dict__ 或 help(clr) 列出了一些可以正常工作的模块,但是 clr.ListAssemblies 列出了更多的程序集,包括我无法使用的程序集。似乎很多程序集都可以通过 clr 加载,但不能用作 Python 中的模块。有什么区别?

标签: python .net pycharm clr python.net


【解决方案1】:

Pythonnet 使用命名空间作为模块。不是上课什么的。它们是clr 的子模块。

import clr
clr.System.Console.WriteLine("foo.bar.baz")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-11
    • 1970-01-01
    • 2017-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多