在Linux上运行的Python脚本如何调用在Wine下运行的Python脚本中的例程?

在Linux上运行的Python脚本如何调用在Wine下运行的Python脚本中的例程?,python,linux,ipc,wine,multiplatform,Python,Linux,Ipc,Wine,Multiplatform,我有一个在Linux上运行的Python(3)脚本,称为主脚本,它必须从专有DLL调用例程。到目前为止,我已经用葡萄酒解决了这个问题,使用了以下结构: # Main script running on Linux import subprocess # [...] subprocess.Popen('echo "python dll_call.py %s" | wine cmd &' % options, shell = True) # [...] 脚本dll_call.py由安装在W

我有一个在Linux上运行的Python(3)脚本,称为主脚本,它必须从专有DLL调用例程。到目前为止,我已经用葡萄酒解决了这个问题,使用了以下结构:

# 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。它基于IPC,介于常规Linux/Unix Python进程和基于Wine的Python进程之间。因为我在太多不同的用例/场景中需要它,所以我将它设计为一个“通用”的插入式替换,它在后台自动完成大部分所需的管道

示例:假设您在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))

,&。它的边缘仍然有点粗糙(即alpha和不安全),但它确实可以处理大多数类型的参数(包括指针)。

您希望在两个进程之间进行通信,其中一个进程由于受到葡萄酒引擎的控制而变得模糊

我在这里的第一个想法是使用一种非常解耦的IPC形式。紧密耦合和葡萄酒之类的东西会导致太多问题

最后,对于一个不熟悉这类东西的人来说,如何让这变得容易呢

显而易见的答案是设置一个web服务器。有很多教程使用Python中的许多包来响应HTTP请求和生成HTTP请求

因此,在WINE过程中设置一个小小的HTTP响应程序,监听一些非标准端口(不是8080或80),并将请求转换为对DLL的调用。如果您很聪明,您可以将web请求()解释为可能不同的DLL调用


另一方面,在非WINE代码中创建HTTP客户端并向服务器发出请求。

您希望在两个进程之间进行通信,其中一个进程由于受WINE引擎的控制而变得模糊

我在这里的第一个想法是使用一种非常解耦的IPC形式。紧密耦合和葡萄酒之类的东西会导致太多问题

最后,对于一个不熟悉这类东西的人来说,如何让这变得容易呢

显而易见的答案是设置一个web服务器。有很多教程使用Python中的许多包来响应HTTP请求和生成HTTP请求

因此,在WINE过程中设置一个小小的HTTP响应程序,监听一些非标准端口(不是8080或80),并将请求转换为对DLL的调用。如果您很聪明,您可以将web请求()解释为可能不同的DLL调用


另一方面,在非WINE代码中创建HTTP客户机,并向服务器发出请求。

您可以使用内置Python stdlib的XMLRPC客户机和服务器来执行您想要的操作。只需让Wine Python将所需的函数公开为XMLRPC方法,并从任何其他Python程序对此进行进程间调用即可

它还可以从CPython调用在Jython或IronPython中运行的函数,也可以跨Python2和Python3调用函数-模块文档中包含的示例应该足够了。只需查看文档:


如果您需要客户端的调用是异步的,或者需要服务器站点响应多个进程,您可以找到其他框架来构建调用-芹菜也应该跨多个不同的python工作,同时保持调用兼容性,当然,这在性能方面已经足够了。

您可以使用内置于Python的stdlib中的XMLRPC客户端和服务器来完成您想要的任务。只需让Wine Python将所需的函数公开为XMLRPC方法,并从任何其他Python程序对此进行进程间调用即可

它还可以从CPython调用在Jython或IronPython中运行的函数,也可以跨Python2和Python3调用函数-模块文档中包含的示例应该足够了。只需查看文档:


如果您需要客户端的调用是异步的,或者需要服务器站点响应多个进程,那么您可以找到其他框架来构建调用-芹菜也应该跨多个不同的python工作,同时保持调用兼容性,这当然是足够的性能明智。

,正如我在回答中列出的XMLRPC一样:Python自己的内置XMLRPC服务器在http上工作,完全满足您的所有需求,此外,一旦一切就绪,调用(包括参数和值序列化)在客户端和服务器端都是透明的。因此,正如我在回答中列出的XMLRPC一样:Python自己的内置XMLRPC服务器在http上工作,完全满足您需要的所有要求,此外,一旦一切就绪,调用(包括参数和值序列化)在客户端和服务器端都是透明的。