Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在MacOSX上运行Python 3.6中的wine命令_Python_Macos_Wine - Fatal编程技术网

在MacOSX上运行Python 3.6中的wine命令

在MacOSX上运行Python 3.6中的wine命令,python,macos,wine,Python,Macos,Wine,我正在尝试用Python编写一个脚本,它打开wine,然后将代码发送到wine终端以打开.exe程序。.exe程序也是命令驱动的 我可以打开葡萄酒,但我无法获得更多: import shlex, subprocess line = "/usr/bin/open -n -a /Applications/Wine\ Stable.app" line2 = '''cd /Applications/application/ && wine application.exe /h1 /k

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

我可以打开
葡萄酒
,但我无法获得更多:

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
似乎没有收到第2行,尽管

/usr/bin/open -n -a /Applications/Wine\ Stable.app
单凭它本身就可以了(它打开的是
Wine
,但没有其他功能。)


我很困惑下一步该怎么做。如果可能的话,我希望避免额外的依赖关系,因为它看起来很简单。

以下内容在很多情况下(在Linux上)对我都有效:

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

该命令启动类似Windows/DOS的shell(
wine cmd
)。实际上,您可以在Linux shell中键入
wine cmd
,然后按enter键——您将发现自己处于DOS shell中。下一步是将命令放入DOS shell。我是通过把它们作为一根细绳穿进去的。在我的示例中,我运行了两个命令:
echo foo
echo bar
。初始的
echo
将命令字符串写入stdout,下面的
|
打开一个管道并将字符串转发到DOS shell中

此外,一旦您向DOS外壳发送命令,请记住它需要Windows路径(当您更改目录等时)。即,在将Unix路径发送到DOS shell之前,必须将其转换为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()

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
,也可以使用单个
&
而不是双
&
将程序转移到后台。
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()