我有一个在 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 运行时库)。您可以执行以下操作:
from zugbruecke import 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 的 stdlib 内置的 XMLRPC 客户端和服务器来执行您想要的操作。只需让您的 Wine-Python 将所需的函数公开为 XMLRPC 方法,然后从任何其他 Python 程序对其进行进程间调用即可。
它还适用于从 CPython 以及跨 Python2 和 Python3 调用在 Jython 或 IronPython 中运行的函数 - 模块文档本身中包含的示例应该足够了。只需检查文档:https://docs.python.org/2/library/xmlrpclib.html
如果您需要在客户端异步调用,或者服务器站点响应多个进程,您可以找到其他框架来构建调用 - Celery 还应该跨多个不同的 Python 工作,同时保留调用兼容性,而且在性能方面肯定足够了。
关于python - 在 Linux 上运行的 Python 脚本如何调用在 Wine 下运行的 Python 脚本中的例程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34984282/