【问题标题】:How to import submodule from a C# dll in Python如何在 Python 中从 C# dll 导入子模块
【发布时间】:2017-07-24 09:38:15
【问题描述】:

我使用pythonnet 在我的 Python 脚本中添加了一个 dll,如下所示:

import os
import clr
clr.AddReference(os.path.join(os.path.abspath('.'), 'dlls', 'Supplier.Bundle.dll'))
import Supplier.Bundle

它工作得很好,我可以直接从 Supplier.Bundle 命名空间调用方法或实例化类,但是当我想从像 Supplier.Bundle.Features 这样的嵌套命名空间调用方法时,我得到了错误:

AttributeError: Features

我还尝试了以下方法:

import Supplier.Bundle.Features

哪个抛出:

ModuleNotFoundError: No module named 'Supplier.Bundle.Features'; 'Supplier.Bundle' is not a package

在 C# 中使用相同的 dll 效果很好:

using Supplier.Bundle.Features

所以我的问题是:如何使用pythonnet 在 Python3.x 中访问 C# dll 的嵌套命名空间的类和方法?

【问题讨论】:

标签: c# python .net namespaces python.net


【解决方案1】:

设法解决了问题。 实际上Supplier.Bundle.dll还有另外两个依赖项,所以在将丢失的dll复制到项目根目录后,导入就没有错误了。

此外,pythonnet 包应该针对该问题抛出更具体的异常。这将使故障排除更加容易。

关于这个问题的更多信息:https://github.com/pythonnet/pythonnet/issues/516

【讨论】:

    【解决方案2】:

    我想我知道解决方法。使用from module import。 请参阅以下示例:

    import clr
    clr.AddReference('System.Windows.Forms')
    #import System.Windows.Forms                # <-- not working
    from System.Windows.Forms import MessageBox # <-- working
    
    MessageBox.Show('Hello World')
    

    希望这会有所帮助。

    【讨论】:

    • 感谢您的回答,但不幸的是,由于这种方法,我得到了ImportError: cannot import name '...'
    • 你的Supplier.Bundle.dll会发生这种情况吗?你能使用像import System.Windows.Forms这样的嵌套命名空间吗?
    • 是的,看起来像。
    猜你喜欢
    • 1970-01-01
    • 2012-05-24
    • 1970-01-01
    • 2015-06-27
    • 1970-01-01
    • 1970-01-01
    • 2017-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多