读取wine应用程序生成的Linux进程的标准输出

2024-04-19 15:48:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个CLI应用程序,它是通过Wine在Linux上执行的,因为它需要一些只适用于Windows的封闭源码dll。不过,我还有另一个工具,在Linux上编译/运行起来要容易得多。Linux应用程序通过STDIN/STDOUT进行通信。你知道吗

因此,我想从Wine派生一个本机Linux进程,传递一些数据(最好是通过stdin),等待进程完成并读取其结果(最好是通过stdout)。如果两个进程都运行在同一个操作系统环境(纯Linux/Posix/Windows)中,那么这很简单,但在我的例子中更复杂。你知道吗

我可以使用popen生成一个Linux进程,但是我不能得到它的stdout(总是得到一个空字符串)。你知道吗

我知道Wine本身不会/不能提供阻塞进程创建(可能这在试图维护Windows语义时会产生很多边缘情况),如Wine bug 18335,stackoverflow answer“Execute Shell Commands from Program running in WINE”中所述。你知道吗

然而,Wine进程仍然在Linux下运行,所以我认为应该可以以某种方式利用Linux(=内核)的功能并进行阻塞读取。你知道吗

  • 有人对如何启动Linux进程并从Wine中获取其标准有什么建议吗?你知道吗
  • 关于如何在不安装复杂服务器的情况下进行IPC,还有其他想法吗?你知道吗

理论上,我可以使用文件系统并等待结果文件出现,或者运行TCP/HTTP服务器进行通信。理想情况下,只有启动的应用程序才可以访问输入,而没有同一主机上的每个应用程序都可以访问的服务器端口。你知道吗

我读过“winelib”作为从“Windows”程序访问本机Unix功能的一种方法,但我不确定我是否完全掌握了如何使用它以及它是否对我有帮助(我可以修改Wine程序,但正如我前面提到的,我需要访问一些我不能修改的封闭源代码dll)。你知道吗

编辑:我刚刚注意到zugbruecke库,它允许与来自(Unix)Python的Windows DLL通信(通过Python的multiprocesing的自定义wine+TCP连接)。我不能按原样使用它(我的DLL库使用了很多指针,所以我通过pybind11包装了它),这意味着我必须对我的应用程序进行一些修改。然而,它可能会导致一个优雅的解决方案,其中的Windows位更加孤立,我可以有更多的Linux乐趣。:-)


Tags: 程序功能应用程序cli进程linuxwindowsstdout