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

标签 python linux ipc wine multiplatform

我有一个在 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/

相关文章:

python - 在不全局安装的情况下使用 Python 库

python - Django:如何在模板渲染期间捕获基于类的 View 中的特定异常?

c - 使用 C 语言编写的本地聊天服务器 IPC

c++ - 进程间通信推荐

python - FIFO 管道中的数据丢失?

python - 远程访问ipython笔记本服务器抛出异常

python - 解析具有随机间距和重复文本的文本文件?

c - 什么是 "write to read-only page"故障?

linux - 转换-追加*网格

xml - 从文本文件中提取数据并输出 xml 文件