在Ubuntu上在Python中导入dll
我在一台安装了Ubuntu的服务器上使用Python 2.6.5。
我需要为我们的应用程序整合一个API,为此,我需要使用API提供商给我的一个DLL文件。他们提供的关于API整合的代码示例是用Visual Basic写的……我在谷歌上搜索了一下,找到了使用ctypes
的一些示例,然后我尝试使用cdll
和pydll
,结果出现了以下错误……
OSError: /home//some.dll: 无效的ELF头
一种可能的解决方案是使用IronPython,但我对IronPython了解不多,所以不确定它是否能完全满足我的需求……
有没有什么可用的模块可以让我在Python中使用这个DLL(或者我是否遗漏了现有的某些东西)。升级我的Python版本很困难吗?
3 个回答
首先,检查一下你的DLL文件是不是一个.NET程序集文件。所谓“程序集DLL文件”,和汇编器没有关系。它只是.NET框架用来把字节码存储在DLL文件中的一种方式!
在Linux上,输入命令 file library.dll
。如果它显示类似下面的内容:
PE32可执行文件(DLL)(控制台)Intel 80386 Mono/.Net程序集,适用于MS Windows
那么你就幸运了:这就是一个程序集文件。你可以在Linux上运行它。
接下来,安装Mono。然后安装 Python.NET。别再考虑IronPython了:它已经不再维护了。
现在,在Python.NET中,你可以这样做:
import clr
clr.AddReference('./library.dll')
# the library has just registered a namespace we can use
from LibraryName import *
但是你怎么知道该导入什么呢?可以用自动补全功能。
或者使用 monop
工具来检查DLL,像这样:
$ monop -r library.dll
Assembly Information:
LibraryName
Version=9.9.3.0
Culture=neutral
PublicKeyToken=null
LibraryName.ClassName
...
$ monop -r library.dll LibraryName.ClassName
public class ClassName {
public ClassName (string inputString);
...
}
它会告诉你关于这个库的所有信息。
DLL文件虽然是Windows系统的东西,但如果一个DLL是“纯.NET”的,并且没有使用特定于Windows的可执行文件,那么它通常可以通过Mono在Linux上运行。(比如用mono命令运行ipy.exe)。
Ironpython的System和类似的Windows模块被定制成可以在不同操作系统上使用(虽然这个还没有经过测试)。
我在Ubuntu上成功运行过NHibernate、FluentNHibernate、log4net和一些其他常用的DLL文件。
import clr
import sys
sys.path.append(os.path.abspath('./DLL')) #where your dlls are
clr.AddReference('System')
clr.AddReference('FluentNHibernate')
from FluentNHibernate.Cfg.Db import PostgreSQLConfiguration
关键似乎在于以这种方式导入DLL。如果一个DLL导入了另一个DLL(比如FluentNHibernate导入了NHibernate),那么你就不需要单独导入NHibernate了。