【问题标题】:Run wine commands from Python 3.6 on Mac OSX在 Mac OSX 上从 Python 3.6 运行 wine 命令
【发布时间】:2018-04-08 11:13:50
【问题描述】:

我正在尝试用 Python 编写一个脚本,该脚本打开wine,然后将代码发送到wine 终端以打开.exe 程序。 .exe 程序也是命令驱动的。

我可以打开wine,但我无法打开:

import shlex, subprocess

line = "/usr/bin/open -n -a /Applications/Wine\ Stable.app"
line2 = '''cd /Applications/application/ && wine application.exe /h1 
/k0 Z:/Users/myname/Desktop/File.TXT''' 
line = shlex.split(line)
p1 = subprocess.Popen(line)
p1.stdin.write(line2.encode())

上面的不行,wine好像没有收到line2,虽然

/usr/bin/open -n -a /Applications/Wine\ Stable.app

它本身很好(它会打开Wine,但没有别的。)

我对下一步应该做什么感到很困惑。如果可能的话,我想避免额外的依赖,因为它看起来很简单。

【问题讨论】:

  • shlex 似乎没有保留换行符,您需要在 shell 中以某种方式区分命令(因为它们现在都在一行上)。我建议在命令之间使用&&。
  • 这是一个开始,感谢您注意到这一点,但它似乎仍然不起作用,甚至为 '''/usr/bin/open -n -a /Applications/Wine\ Stable 替换行.app && cd /Applications/application/ ''' 甚至不打开 wine,而 '''/usr/bin/open -n -a /Applications/Wine\ Stable.app''' 会
  • Wine Stable.app 在您调用它或阻止终端时是否返回?如果它被阻塞,那么其他命令在它完成之前不会运行。
  • 我怎么知道,如果它被阻塞,我该如何解决这个问题?
  • 尝试在普通终端中运行相同的命令,看看终端是否在应用打开或等待关闭时继续工作。如果程序阻塞了终端,您可以对subprocess.Popen 进行两次调用,或者您可以使用单个& 而不是两个&& 将程序分叉到后台。

标签: python macos wine


【解决方案1】:

在许多情况下(在 Linux 上)以下内容对我有用:

import subprocess

command = 'echo "echo foo && echo bar" | wine cmd > std_out.txt 2> std_error.txt &'
subprocess.Popen(command, shell = True)

(我相信wine 也可以作为 MacOS 上的命令使用,就像那样。如果我错了,请纠正我。)

该命令会启动一个类似于 Windows/DOS 的 shell (wine cmd)。你实际上可以在你的 Linux shell 中输入wine cmd 并按回车键——你会发现自己在一个 DOS shell 中。下一步是将命令输入 DOS shell。我通过将它们作为字符串插入其中来做到这一点。在我的示例中,我运行了两个命令:echo foo 和 echo bar。最初的echo 将命令字符串写入stdout,后面的| 打开一个管道并将字符串转发到DOS shell。

此外,一旦您向 DOS shell 发送命令,请记住它需要 Windows 路径(当您更改目录等时)。 IE。在将它们发送到 DOS shell 之前,您必须将 Unix 路径转换为 ​​Windows 路径。您可以像这样在命令行上自动转换路径...

winepath -w /home/ 2> /dev/null

...导致Z:\home\(例如)。或者,以下 Python 片段也会为您做同样的事情:

def convert_unix_path_to_windows_path(in_path):
    cmd = ['winepath', '-w', in_path]
    proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    (out, err) = proc.communicate()
    return out.decode('utf-8').strip()

【讨论】:

    猜你喜欢
    • 2016-04-24
    • 2012-08-09
    • 2017-06-16
    • 2018-04-26
    • 1970-01-01
    • 2020-08-02
    • 2015-10-27
    • 2015-04-09
    • 2019-06-15
    相关资源
    最近更新 更多