2 votes

Exécuter des commandes wine à partir de Python 3.6 sur Mac OSX

J'essaie d'écrire un script en Python qui ouvre wine et envoie ensuite du code à la wine pour ouvrir un .exe programme. Le site .exe est également piloté par des commandes.

Je peux ouvrir wine mais je n'arrive pas à aller plus loin :

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())

Ce qui précède ne fonctionne pas, wine ne semble pas recevoir la ligne2, bien que

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

par lui-même est bien (il ouvre Wine mais rien d'autre).

Je suis assez confus quant à la prochaine étape à suivre. Je voudrais éviter les dépendances supplémentaires si possible, car cela semble simple.

1voto

ernestopheles Points 678

La méthode suivante a fonctionné pour moi dans de nombreux cas (sous Linux) :

import subprocess

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

(Je crois wine est également disponible en tant que commande sous MacOS, comme ça. Veuillez me corriger si je me trompe).

La commande lance un shell de type Windows/DOS ( wine cmd ). Vous pouvez en fait taper wine cmd dans votre shell Linux et appuyez sur Entrée - vous vous retrouverez dans un shell DOS. L'étape suivante consiste à introduire des commandes dans le shell DOS. Pour ce faire, je les introduis dans le shell sous forme de chaîne. Dans mon exemple, je lance deux commandes : echo foo y echo bar . L'initiale echo écrit la chaîne de commande dans la sortie d'état, ce qui donne le résultat suivant | ouvre un tube et transmet la chaîne de caractères dans le shell DOS.

En outre, lorsque vous envoyez des commandes au shell DOS, n'oubliez pas qu'il s'attend à des chemins d'accès Windows (lorsque vous changez de répertoire, etc.). En d'autres termes, vous devez traduire vos chemins Unix en chemins Windows avant de les envoyer au shell DOS. Vous pouvez convertir automatiquement vos chemins sur une ligne de commande comme ceci ...

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

... ce qui entraîne Z:\home\ (par exemple). Vous pouvez également utiliser le code Python suivant pour faire la même chose :

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()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X