8

我有一些 .dll 文件,其中的类旨在控制通过以太网连接到我的桌面的外部设备。我想将这些类导入 python 并使用它们的成员函数/变量等来控制设备。

我查看了许多选项,包括:

-ctypes (这似乎适用于函数但不适用于类)。这里“DotNet\Aerotech.Ensemble.dll”是我的 dll 库,“Network”是该库中的一个类,具有成员函数“Connect”。库加载,但我无法访问该类...

>>> from ctypes import *
>>> lib = cdll.LoadLibrary('DotNet\Aerotech.Ensemble.dll')
>>> lib.Network.Connect()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python26\lib\ctypes\__init__.py", line 366, in __getattr__
    func = self.__getitem__(name)
  File "C:\Python26\lib\ctypes\__init__.py", line 371, in __getitem__
    func = self._FuncPtr((name_or_ordinal, self))
AttributeError: function 'Network' not found

-IronPython / Python for .Net,但这些似乎完全是不同的语言,我希望能够从一个地方(python)做所有事情。

-SWIG。SWIG 文档似乎表明它可以处理导入类,但似乎也需要包装 C++ 代码和/或头文件(我没有)以用作 python 模块。

我是一个初学者,在这里相当迷失,所以任何帮助表示赞赏!

编辑:

@SvenMarnach:我查看了 IronPython 并能够让它与我的 dll 文件一起使用,但我想在Python中执行此操作,因为我已经在使用该语言做很多事情。我想将这些 dll 函数或类或其他任何东西集成到现有的 python 程序中。

然而,在让 IronPython 工作的过程中,我偶然发现了Python for .NET,它声称能够将 .Net 感知安装到现有的 python 安装中......如果我使用,这可以工作(即我可以访问 dll 文件并控制我的设备)它在我将 python for .NET 文件下载到的目录中,但是如果我在其他目录中尝试它(记得将​​ python.net 目录附加到 sys.path),你会得到一个错误ImportError: dynamic module does not define init function (initclr)

4

1 回答 1

1

据我了解,您想在 python 代码中使用 .NET 类。我对 C# 及其工作方式也不是很熟悉,但如果我理解正确,它可以编译成通用中间语言的 DLL。该 CIL 是由 Microsoft 发明的 Common Language Infrastructure 定义的编程语言,也是 .NET 框架的基础。要阅读 CIL,您必须使用公共语言运行时,它基本上是一个即时编译器来机器可读的字节码。我认为这是解决您问题的方法。要使用 DLL 中定义的类(希望包含 CIL 中的类),您需要一个将 CIL 映射到 Python 字节码的 CLR!IronPython 有这样一个 CLR 映射器。但是,可以使用与纯 Python 一起工作的 CLR,这些映射器通常只能是一种方式(我使用的那个)。

我希望这对我有所帮助。如果您需要更多信息,我建议您查看有关 IronPython 的 .NET 集成的文档,如上所述。

于 2012-06-29T13:40:22.600 回答