Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 27/06/2017, à 14:23

maaxime

[script] Ouvrir un fichier excel dans une vm depuis le host

Bonjour,

J'utilise xubuntu (vs17.04) dans mon environnement professionnel et j'ai besoin d'avoir les outils de la suite Mircosoft Office. J'ai essayé libreoffice mais la compatibilité n'est pas assez bonne pour mon utilisation. J'ai essayé Excel et ces consorts dans playonlinux mais il est sujet a plusieurs petits problèmes : plante régulièrement, mais beaucoup trop de temps à s'ouvrir et plusieurs petits autre problème.

Je me suis donc rabattu sur l'utilisation d'une machine virtuelle sous w7 avec la suite Microsoft installé dessus.
L'ergonomie n'est pas terrible car il faut que j'utilise l'explorer Windows et je ne peux pas bénéficier de mon petit Nemo !!! J'ai donc trouvé la solution : j'ai fait un script qui lance depuis xubuntu les logiciels Excel, Word, PowerPoint, Visio et MSAccess dans la machine virtuelle
Pour ce faire, j'ai utilisé le fonction "vboxmanage" de Virtualbox avec la syntaxe "guestcontrol start". J'ai fait ce script en python car je le maîtrise un minimum et je ne suis pas un expert en programmation. Je pense qu'il aurait mérité d'être fait en bash.
Ce script peut servir à lancer n'importe quel application dans une machine virtuelle sous VirtualBox en lui précisant le fichier à ouvrir.

J'ai créer un fichier /home/user/toExcelVm/cmd.py

#!/usr/bin/python2
# -*- coding: utf-8 -*-
import sys
import subprocess

#récupère le type voulu : excel ou word
typ = sys.argv[1]
#récupère le chemin du fichier à ouvrir
argfs = sys.argv[2]
tab = argfs.split("/")

#test si le chemin est compatible avec celui attendu...
if tab[0] == '' and tab[1] == 'home' and tab[2] == 'user':
	del tab[0]
	del tab[0]
	del tab[0]
	tab.insert(0,"Z:")
	fs = "\\".join(tab)
	print fs

#si typ excel alors on pointe vers excel, si word on pointe vers word.
if typ == "--calc":
	filexe = "C:\Program Files\Microsoft Office\Office14\EXCEL.EXE"
	Namexe = "excel.exe"
elif typ == "--word":
	filexe = "C:\Program Files\Microsoft Office\Office14\winword.EXE"
	Namexe = "winword.exe"
elif typ == "--ppt":
	filexe = "C:\Program Files\Microsoft Office\Office14\powerpnt.EXE"
	Namexe = "powerpnt.exe"
elif typ == "--vsd":
	filexe = "C:\Program Files\Microsoft Office\Office14\Visio.EXE"
	Namexe = "visio.exe"
elif typ == "--mdb":
	filexe = "C:\Program Files\Microsoft Office\Office14\MSAccess.EXE"
	Namexe = "msaccess.exe"
else:
	filexe = ""
	Namexe = ""

########test si la machine virutelle est ouverte
def testVm():
	a=subprocess.Popen(["vboxmanage", "list", "runningvms"],stdout=subprocess.PIPE, stderr=subprocess.PIPE)
	out, err = a.communicate()

	if out.find("{f2357c03-9304-4b74-b0e0-8d7c156eb28e}") >= 0:
		return 1
	else:
		return 0
#si la vm n'est pas ouvete on l'ouvre
if testVm() == 0:
	subprocess.check_call(['VBoxManage', 'startvm', '{f2357c03-9304-4b74-b0e0-8d7c156eb28e}'])
	print "startvm"

#execute la commande via vboxmanage.
subprocess.check_call(['VBoxManage', 'guestcontrol', '{f2357c03-9304-4b74-b0e0-8d7c156eb28e}', '-v',  'start', '--exe', filexe, '--username', 'user', '--password', 'password', '--', Namexe, fs])

#donne le focus
#subprocess.check_call(['wmctrl', '-a'])
nameWindow = 'MSOffice [En fonction] - Oracle VM VirtualBox'
subprocess.check_call(['wmctrl', '-a', nameWindow])

Ensuite j'ai ajouté des lanceurs via l'éditeur de menu.
Commande pour Excel : python toExcelVm/cmd.py --calc %U
Commande pour Word : python toExcelVm/cmd.py --word %U
Commande pour MSAccess : python toExcelVm/cmd.py --mdb %U
Commande pour Power Point : python toExcelVm/cmd.py --ppt %U
Commande pour Visio : python toExcelVm/cmd.py --vsd %U

Le premier argument à passer à mon script est le type d'application à lancer (Excel, Word, Visio, etc...)

J'ai aussi mis un joli titre et de jolie icône aux lanceurs ça fait plus classe !!
Pour finir j'ai juste défini mes lanceurs par défaut pour les fichiers concernés.

J'utilise wmctrl pour donner le focus à la machine virtuelle, il faut l'installé s'il ne l'est pas :

sudo apt install wmctrl

Il vous faut aussi adapté le fichier pour votre utilisation :
Remplacer user par le nom de votre utilisateur sur  votre machine hôte.

if tab[0] == '' and tab[1] == 'home' and tab[2] == 'user'

Remplacer l'uuid de ma vm (pour lister les vm : 'VBoxManage list vms') par la votre et remplacer user et password par le nom d'utilisateur et le mot de passe utilisé dans la vm

if out.find("{f2357c03-9304-4b74-b0e0-8d7c156eb28e}") >= 0:
...
subprocess.check_call(['VBoxManage', 'startvm', '{f2357c03-9304-4b74-b0e0-8d7c156eb28e}'])
...
subprocess.check_call(['VBoxManage', 'guestcontrol', '{f2357c03-9304-4b74-b0e0-8d7c156eb28e}', '-v',  'start', '--exe', filexe, '--username', 'user', '--password', 'password', '--', Namexe, fs])

Modifier avec le titre de votre vm (faire un "wmctrl -l" pour le récupérer)

nameWindow = 'MSOffice [En fonction] - Oracle VM VirtualBox'

Pour que les applications récupèrent le bon chemin, mon script remplace le chemin "/home/user/" par "Z:" et remplace les / par des \. J'ai aussi monté un lecteur réseau dans la vm en z: qui pointe sur le "/home/user" de ma machine hôte.
Et vu que j'ai monté les lecteurs réseaux de mon xubuntu dans un dossier de mon home, ça marche aussi pour les accès aux fichiers sur le réseau !!!

Reste plus qu'à voir avec une utilisation intensive.

Je kif  cool

Dernière modification par maaxime (Le 28/06/2017, à 14:03)

Hors ligne