当前位置: 首页 > 面试题库 >

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

纪成礼
2023-03-14
问题内容

我有一个在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模块直接替换,它可以在后台自动执行大多数必需的管道。

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

代码(LGPL)
,PyPI软件包和文档
。它的边缘仍然有些粗糙(即Alpha和不安全),但是它确实可以处理大多数类型的参数(包括指针)。


问题答案:

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

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

如果您需要调用在客户端或服务器站点上异步进行响应,以响应多个进程,则可以找到其他框架来构建调用-
Celery还应跨多个不同的Python工作,同时保持调用兼容性,在性能方面肯定足够了。



 类似资料:
  • 问题内容: 我有一个脚本,可以创建网站并动态打印一些数据。-打印的数据应来自另一个python脚本。 我目前面临的问题是,如果我将执行python脚本的行放在执行应用程序的行之前,它将运行Python脚本而不运行;反之亦然。 Python脚本: Flask脚本(注意:价格应为其他脚本的“解析”变量): 问题答案: 使用: 将python脚本(例如)生成的内容包装到函数中。 将其放置在与或相同的目录

  • 问题内容: 我不知道应该把我的Spider代码放在哪里以及如何从main函数中调用它。请帮忙。这是示例代码: 问题答案: 所有其他答案均参考Scrapyv0.x。根据更新的文档,Scrapy 1.0要求:

  • 问题内容: 我已经阅读了多篇文章和许多文章,详细介绍了cron作业中的脚本需要保留由于cron中shell的打开而在脚本本身内部运行所需的环境变量。我的情况是独特的,因为我的路径变量都是按照所讨论的那样设置的,这反过来将使用subprocess.call ()成功调用pysaunter python egg ,但是它似乎从那里分解了。这导致整个过程中断了cron作业。 为了清楚起见,以下是我引用的

  • 问题内容: 我正在编写一个python脚本,该脚本可以检查各种条件并相应地运行powershell脚本,以帮助我自动完成从Windows XP到Windows 7的迁移。powershell脚本提供了自己的输出,可让用户了解发生的情况。我想获取powershell脚本的输出并将其打印为python脚本的输出。我环顾了一些问题,这些问题似乎想做同样的事情,但似乎对我没有帮助。最初我尝试使用 如此处的

  • 问题内容: 我有一个脚本,每5分钟检查一次PC上的内容,并且我不希望Python显示在任务栏上。我使用Windows作为操作系统。 有什么方法可以让Python在后台运行并强制其不在我的任务栏中显示? 问题答案: 在控制面板中查找计划任务。

  • 问题内容: 我是python的新手。只知道什么是python。我创建了以下代码(在python IDLE中): 然后,我将此页面保存在本地主机中为index.py 我使用http://localhost/index.py运行脚本 但是它没有显示执行的python脚本。而是将上面的代码显示为HTML。问题出在哪儿?请有人告诉我如何在网页中运行python吗? 问题答案: 为了显示您的代码,您需要执行