I am trying to write a script in Python which opens
wine and then sends code to the
wine terminal to open a
.exe program. The
.exe program is also command driven.
I can open
wine, but I can't get any further:
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())
The above doesn't work,
wine doesn't seem to receive line2, although
/usr/bin/open -n -a /Applications/Wine\ Stable.app
by itself is fine (it opens
Wine but nothing else.)
I'm pretty confused about what the next step should be. I would like to avoid additional dependencies if possible, because it seems simple.
The following has worked for me in many cases (on Linux):
import subprocess command = 'echo "echo foo && echo bar" | wine cmd > std_out.txt 2> std_error.txt &' subprocess.Popen(command, shell = True)
wine is also available as a command on MacOS, just like that. Please correct me if I am wrong.)
The command fires up a Windows/DOS-like shell (
wine cmd). You can actually type
wine cmd into your Linux shell and hit enter - you'll find yourself in a DOS shell. The next step is to get commands into the DOS shell. I do this by piping them into it as a string. In my example, I run two commands:
echo foo and
echo bar. The initial
echo writes the command string to stdout, the following
| opens a pipe and forwards the string into the DOS shell.
Besides, once you send commands to the DOS shell, keep in mind that it expects Windows paths (when you change directories etc). I.e. you must translate your Unix paths into Windows paths before you send them into the DOS shell. You can automatically convert your path on a command line like this ...
winepath -w /home/ 2> /dev/null
... resulting in
Z:\home\ (for example). Alternatively, the following Python snipped will do the same for you:
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()