ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

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

2019-10-03 00:01:03  阅读:270  来源: 互联网

标签:multiplatform wine python linux ipc


我有一个在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.它基于IPC在常规Linux / Unix Python进程和基于Wine的Python进程之间.因为我在太多不同的用例/场景中需要它,所以我将其设计为“通用”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& 0700 3.它的边缘仍然有点粗糙(即alpha和不安全),但它确实处理大多数类型的参数(包括指针).

解决方法:

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

它也适用于从CPython调用Jython或IronPython中运行的函数,以及Python2和Python3中的函数 – 模块文档中包含的示例本身就足够了.只需检查文档:https://docs.python.org/2/library/xmlrpclib.html

如果您需要在客户端调用异步,或者服务器站点响应多个进程,您可以找到构建调用的其他框架–Celery也应该在几个不同的Pythons上工作,同时保留调用兼容性,而且在性能方面肯定是足够的.

标签:multiplatform,wine,python,linux,ipc
来源: https://codeday.me/bug/20191002/1845381.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有