【发布时间】:2016-05-01 06:30:46
【问题描述】:
我有一个在 Linux 上运行的 Python (3) 脚本,称为主脚本,它必须从专有 DLL 调用例程。到目前为止,我已经使用 Wine 使用以下结构解决了这个问题:
# Main script running on Linux
import subprocess
# [...]
subprocess.Popen('echo "python dll_call.py %s" | wine cmd &' % options, shell = True)
# [...]
脚本 dll_call.py 由安装在 Wine 下的 Windows Python (3) 解释器执行。它将返回值转储到一个文件中,然后由等待的主脚本拾取该文件。如果我必须连续执行几次,这并不完全可靠且速度非常慢。
我想启动脚本 dll_call.py 一次,提供某种类型的简单服务器,它应该以某种方式公开所需的例程。归根结底,我希望主脚本看起来像这样:
# Main script running on Linux
import subprocess
# [...]
subprocess.Popen('echo "python dll_call_server.py" | wine cmd &', shell = True)
# [...]
return_values = call_into_dll(options)
如何才能最好地实现这一点(如果需要速度并且不关心安全性)?
感谢@jsbueno 和@AustinHastings 的回答和建议。
对于那些有类似问题的人:受上述答案的启发,我编写了一个小型 Python 模块,用于在 Linux 上从 Python 调用 Windows DLL。它基于常规 Linux/Unix Python 进程和基于 Wine 的 Python 进程之间的 IPC。因为我在太多不同的用例/场景中都需要它,所以我将它设计为“通用”ctypes module 替代品,它会在后台自动完成大部分所需的管道。
示例:假设您在 Linux 上使用 Python,安装了 Wine,并且您想调用 msvcrt.dll(Microsoft C 运行时库)。您可以执行以下操作:
import zugbruecke as ctypes
dll_pow = ctypes.cdll.msvcrt.pow
dll_pow.argtypes = (ctypes.c_double, ctypes.c_double)
dll_pow.restype = ctypes.c_double
print('You should expect "1024.0" to show up here: "%.1f".' % dll_pow(2.0, 10.0))
Source code (LGPL)、PyPI package 和 documentation。它的边缘仍然有点粗糙(即 alpha 和不安全),但它确实可以处理大多数类型的参数(包括指针)。
【问题讨论】:
标签: python linux ipc wine multiplatform