在Ubuntu上在Python中导入dll

3 投票
3 回答
11358 浏览
提问于 2025-04-17 04:53

我在一台安装了Ubuntu的服务器上使用Python 2.6.5。

我需要为我们的应用程序整合一个API,为此,我需要使用API提供商给我的一个DLL文件。他们提供的关于API整合的代码示例是用Visual Basic写的……我在谷歌上搜索了一下,找到了使用ctypes的一些示例,然后我尝试使用cdllpydll,结果出现了以下错误……

OSError: /home//some.dll: 无效的ELF头

一种可能的解决方案是使用IronPython,但我对IronPython了解不多,所以不确定它是否能完全满足我的需求……

有没有什么可用的模块可以让我在Python中使用这个DLL(或者我是否遗漏了现有的某些东西)。升级我的Python版本很困难吗?

3 个回答

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);

        ...
}

它会告诉你关于这个库的所有信息。

3

DLL是Windows系统特有的东西。你想用DLL的话,必须使用Windows版本的Python。你可以在Ubuntu上运行Windows版的Python,但需要在一个虚拟机里安装Windows。还有一种方法是使用Wine,这也可能让你在Linux上运行Windows程序。

当然,另一种选择是问问你的API提供者,看看他们是否有Linux版本的API。

7

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了。

撰写回答