我有一个CLI应用程序,该应用程序通过Linux在Wine上执行,因为它需要一些仅适用于Windows的封闭源DLL。但是我还有另一个工具,它在Linux上编译/运行要容易得多。该Linux应用程序通过STDIN / STDOUT进行通信。
所以我想从Wine生成一个本地Linux进程,传递一些数据(最好通过stdin),等待该进程完成并读取其结果(最好通过stdout)。如果这两个进程都可以在相同的OS环境(纯Linux / Posix / Windows)中运行,这是微不足道的,但就我而言,则更为复杂。
我可以使用popen生成Linux进程,但无法获取其stdout(始终获取空字符串)。
我了解Wine本身不会/无法提供阻塞进程的创建(可能在尝试维护Windows语义时会产生很多边缘情况),如Wine bug 18335中所述,stackoverflow回答“ {{3 }}”。
但是Wine进程仍在Linux下运行,所以我认为应该可以以某种方式利用Linux(=内核)的功能并进行阻塞读取。
从理论上讲,我可以使用文件系统并等待结果文件出现或运行TCP / HTTP服务器进行通信。理想情况下,输入仅对于已启动的应用程序是可访问的,而没有服务器端口,同一主机上的每个应用程序都可以访问该服务器端口。
我读到有关“ winelib”的信息,这是一种从“ Windows”程序访问本机Unix功能的方式,但我不确定我是否完全掌握如何使用它以及它是否对我有帮助(我可以修改Wine程序,但是前面提到,我需要访问一些无法修改的封闭源DLL。
编辑:我刚刚注意到Execute Shell Commands from Program running in WINE库,该库允许与(Unix)Python中的Windows DLL通信(通过来自Python多进程的自定义wine + TCP连接)。我不能按原样使用(我的DLL库使用很多指针,所以我已经通过pybind11对其进行了包装),这意味着我必须对应用程序进行一些重做。但是,这可能会导致一个优雅的解决方案,其中Windows位更加孤立,我可以获得更多的Linux乐趣。 :-)