OVH Cloud OVH Cloud

Python et Windows

13 réponses
Avatar
Hexade
Suite =E0 l'achat d'un nouvel ordinateur (HP Pavilion), je fus surpris
d'y d=E9couvrir une version de Python pr=E9install=E9e par d=E9faut sous
Windows. Certes, il s'agit de la version 2.2, mais c'est d=E9j=E0 =E7a.

Une br=E8ve recherche me montre que les logiciels Cyberlink Power
Cinema et HP DVD Play contiennent tous deux les fichiers pythopn24.dll
et python24.zip (via Freeze ?).

De plus, comme j'ai install=E9 OpenOffice.org 2 (qui contient Python
2=2E3.4) et Python 2.5, je me retrouve au total avec pas moins de 4
versions diff=E9rentes de Python diff=E9rentes sur un m=EAme pc !

10 réponses

1 2
Avatar
Rakotomandimby (R12y)
Hexade:

Suite à l'achat d'un nouvel ordinateur (HP Pavilion)[...] je me
retrouve au total avec pas moins de 4 versions différentes de Python
différentes sur un même pc !


Oui mais sont-elles utilisables hors de leur "contexte"?

Avatar
Amaury Forgeot d'Arc
Hexade:

Suite à l'achat d'un nouvel ordinateur (HP Pavilion)[...] je me
retrouve au total avec pas moins de 4 versions différentes de Python
différentes sur un même pc !


Oui mais sont-elles utilisables hors de leur "contexte"?


Le python2.2 qui vient avec HP Pavilion a l'air d'être une installation
très standard, dans c:python22, avec inscription dans la base de
registre, pywin32 et tout et tout.
Je m'en suis beaucoup servi au début, avant de passer à un python un peu
plus moderne...

--
Amaury


Avatar
Michel Claveau
Bonjour !

Je suis intéressé par toutes les informations permettant de :
- avoir deux versions différentes de Python AVEC Pywin32
- savoir installer Pywin32 dans le Python embarqué dans OOo
- utiliser Python 2.5 DANS OOo

Si quelqu'un a des idées là-dessus...


--
@-salutations

Michel Claveau
Avatar
Amaury Forgeot d'Arc
Bonjour !


Bonjour,


Je suis intéressé par toutes les informations permettant de :
- avoir deux versions différentes de Python AVEC Pywin32
- savoir installer Pywin32 dans le Python embarqué dans OOo
- utiliser Python 2.5 DANS OOo

Si quelqu'un a des idées là-dessus...



Trois questions, trois réponses:

1 - (là, c'est simple)
les Dlls de pywin32 contiennent toutes le numéro de version de python.
par exemple chez moi, c:windowssystem32 contient les fichiers:
python22.dll
python24.dll
pythoncom22.dll
pythoncom24.dll
pywintypes22.dll
pywintypes24.dll
Donc pas de souci pour la cohabitation deux versions majeures de python,
à condition que ce soient des installations "officielles" faites avec
l'installeur.

2 - (ça se complique)
A mon avis, pywin32 est une horreur d'installation:
- il s'installe dans c:windowssystem32
- le nom de la dll n'est pas celui du module
- pour y remédier, il installe donc des clefs de registre du genre
"pywintypes? va donc voir pywintypes22.dll"

Dans mon précédent emploi, python était totalement embarqué dans
l'application, et il fallait que tout soit en "vase clos": interdit
d'utiliser la base de registres de python, interdit de s'installer dans
system32...
La solution a été de *recompiler* pywin32, en modifiant le nom des Dlls.
Je pense que ainsi on a perdu la possibilité de lancer un "serveur COM",
mais bon.

3 - (une réponse, mais pas une solution)
OOo contient des modules d'extension à python, ce qui lui permet
d'exposer ses propres fonctions accessibles aux scripts python.
Pour faire la même chose avec python 2.5 il faut forcément recompiler
OOo avec python 2.5...

Ah si, il est toujours possible de démarrer un process python2.5, et de
communiquer par socket par exemple.

--
Amaury

Avatar
Michel Claveau
Bonsoir !

Merci pour ces intéressantes infos. Malheureusement, comme j'use et
abuse de COM (clients et serveurs écrits en Python), ça va accrocher
dur (surtout pour les Q.2 & 3)

Mais j'archive le message ; il peut me resservir un de ces jours.
Merci.

--
@-salutations

Michel Claveau
Avatar
Amaury Forgeot d'Arc
Bonsoir !

Merci pour ces intéressantes infos. Malheureusement, comme j'use et
abuse de COM (clients et serveurs écrits en Python), ça va accrocher dur
(surtout pour les Q.2 & 3)


Espèrais-tu transformer OOo en serveur COM ?

--
Amaury

Avatar
MC
Salut !

Espèrais-tu transformer OOo en serveur COM ?
Je l'utilise déjà comme serveur COM ; ça marche à peu près (pas mal de

limites, mais il y a un minimum suffisant pour être utilisation en
prod)

En fait, pour OOo, j'aurais plutôt aimé pouvoir utiliser les fonctions
"client COM" de Python+Pywin.

--
@-salutations

Michel Claveau

Avatar
hg
MC wrote:

En fait, pour OOo, j'aurais plutôt aimé pouvoir utiliser les fonctions
"client COM" de Python+Pywin.


Tu veux dire comment appeler Python depuis un client COM ou COM depuis
Python ? a priori les deux sont possibles.

hg

Avatar
Michel Claveau
Bonjour !

Tu peux t'inspirer du script "brut" ci-dessous.


# -*- coding: cp1252 -*-

#
# by Michel Claveau Informatique
# http://mclaveau.com
#



import types
import time
import os
from win32com.client import Dispatch


GlobalPVersion='0.912'


class word(object):

wdReplaceNone=0
wdReplaceOne=1
wdReplaceAll=2
wdFindContinue=1

#pour close/save :
wdDoNotSaveChanges=0
wdSaveChanges=-1

wdCharacter=1
wdCell
wdLine=5

wdAlignLeft=0
wdAlignCenter=1
wdAlignRight=2



def __init__(self, fichier=None, visible=True):
import win32com.client
import time,os,types
self.objServiceManager =
win32com.client.Dispatch("com.sun.star.ServiceManager")


#self.propert=self.objServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue")

self.w =
self.objServiceManager.CreateInstance("com.sun.star.frame.Desktop")

if fichier!=None:
time.sleep(1)
self.open(fichier, visible)


def u1252(self, chu):
try:
if type(chu) is unicode:
return chu.encode('cp1252','replace')
else:
return chu
except:
return repr(chu)


def open(self, fichier, visible=True):
"""Ouvre un document word
"""
self.doc=self.w.loadComponentFromURL("file:///"+fichier,
"_blank", 0, [])
#self.visible(visible)


def wnew(self, visible=True):
"""Nouveau document writer
"""
self.doc=self.w.loadComponentFromURL("private:factory/swriter",
"_blank", 0, [])
self.visible(True)


def close(self):
"""ferme le document, en sauvegardant, sans demander
"""
#---
print"close"
self.w.store()
self.w.Terminate(1)


def docclose(self):
"""ferme le document, en sauvegardant, sans demander
"""
self.doc.Close(True) #True ? False ?


def saveas(self,fichier, typ=0):
"""Appel de 'Enregistrer sous', avec le nom du fichier
"""#---
self.doc.storeAsURL("file:///"+fichier, [])


def savepdf(self):

def createStruct(nom):
objCoreReflection=
self.objServiceManager.createInstance("com.sun.star.reflection.CoreReflection")
classSize = objCoreReflection.forName(nom)
aStruct=[1,2]
classSize.createObject(aStruct)
return aStruct

par=createStruct("com.sun.star.beans.PropertyValue")
par.append([])
par[0].Name = "URL"
par[0].Value = "file:///C:/let01.odt"

par=["FilterName", "writer_pdf_Export"]
self.prop =
self.objServiceManager.CreateInstance("com.sun.star.beans.PropertyValue")
self.prop[0].Name = "URL"
self.prop[0].Value = "file:///C:/let01.odt"
self.prop[1].Name = "FilterName"
self.prop[1].Value = "writer_pdf_Export"
self.doc.storeAsURL("file:///C:/let01.pdf", self.prop)


def saveas2(self,fichier, typ=0):

def createStruct(nom):
objCoreReflection=
self.objServiceManager.createInstance("com.sun.star.reflection.CoreReflection")
classSize = objCoreReflection.forName(nom)
aStruct=[]
classSize.createObject(aStruct)
return aStruct

#args1=
self.objServiceManager.createInstance("com.sun.star.beans.PropertyValue")
#args1 = createStruct("com.sun.star.beans.NamedValue")
#print args1

print "Titre :",self.doc.getDocumentInfo()

args1=["file:///c:/titi.rtf"]

self.doc.storeAsURL("",0,args1)


"""
#args1=
self.objServiceManager.createInstance("com.sun.star.beans.PropertyValue")
#dispatcher =
self.objServiceManager.createInstance('com.sun.star.frame.DispatchHelper')
args1=createStruct("com.sun.star.beans.PropertyValue")
print len(args1)
prop.Name='Pages'
prop.Value='3-5'
args[0]=prop

args1[0].Name = "URL"
args1[0].Value = "file:///c:/titi.rtf"
args1[1].Name = "FilterName"
args1[1].Value = "Rich Text Format"
args1[4].Name = "SelectionOnly"
args1[4].Value = true
"""
#sel=self.doc.SaveAs("",0,args1)

def quit(self):
"""Ferme OOoW
"""
self.w.Terminate()


def quitSaveChange(self):
"""Ferme OooW, en sauvant les changements
"""
self.w.store()
self.w.Terminate()


def quitCancel(self):
"""Ferme word, SANS sauver les changements
"""
self.doc.storeAsURL(r"file:///C:/__null__.odt", [])
self.w.Terminate()
os.remove("C:/__null__.odt")


def visible(self, par=True):
"""Rend Word visible (True), ou invisible (False) ; True par
défaut
Note : c'est plus rapide en invisible
"""
#if par:
# self.objServiceManager.Visible(True)
#else:
# self.objServiceManager.Visibleúlse
"""
if par:
self.w.Visible(True)
else:
self.w.Visibleúlse
"""


def hide(self):
"""Cache Word
"""
self.w.Visibleúlse


def wprint(self):
"""Imprime le document
"""
warg=[]
self.doc.Print(warg)


def wprint2(self,printer='PDFCreator'):
"""Imprime le document
"""
warg=['Name','PDFCreator']
self.doc.Print(warg)

# prop.Name='Name'
# prop.Value='PDFCreator'
# args[2]=prop


def preview(self):
"""Pré-visualise le document
"""
self.doc.PrintPreview()


def previewclose(self):
"""Ferme la prévisdualisation du document
"""
self.doc.ClosePrintPreview()


def text(self, txt):
"""Remplace le texte sélectionné, par le paramètre
"""
newchaine=txt.replace('n','r')
self.position.Text = newchaine


def TypeText(self, chaine):
""" 'Tape' le texte à la position courante
"""
self.position.TypeText(chaine)


def chExist(self, chaine):
"""Cherche l'existence d'une chaine dans le document.
Retourne True ou False, selon le résultat.
"""
och=self.doc.createSearchDescriptor()
och.SearchString=chaine
och.SearchWords = False #mots entiers seulement ?
position=self.doc.findFirst(och)
if position:
return True
else:
return False


def chSelect(self, chchaine):
"""Sélectionne (recherche) la chaine passée en paramètre
"""
och=self.doc.createSearchDescriptor()
och.SearchString=chaine
och.SearchWords = False #mots entiers seulement ?
self.sel=self.doc.findFirst(och)
if position:
return True
else:
return False


def macroRun(self, name):
"""Lance la macro-word (VBA) 'name'
"""
print "Non supporté _ àcf"
print "Non supporté _ àcf"
print "Non supporté _ àcf"


def language(self):
"""Retourne la langue de Writer
"""
print "Non supporté _ àcf"
print "Non supporté _ àcf"
print "Non supporté _ àcf"


def filterTxt(self):
"""Interne - Convertit une sélection en texte
"""
ss=self.u1252(self.doc.GetText().String)
ss=ss.replace(chr(7)+chr(13),' ')
ss=ss.replace(chr(13),'rn')
ss=ss.replace(chr(7),' ')
ss=ss.replace(chr(9),'')
ss=ss.replace(chr(26),'')
return ss


def eSelAll(self):
"""sélectionne, et retourne, tout le document
"""
sel=self.doc.GetText()
return self.filterTxt()


def eSelWord(self, nb=1):
"""étend la sélection aux nb mots à droite, et retourne la
sélection
"""
self.w.Selection.WordRightSel(self.wdWord, nb, self.wdExtend)
return self.filterTxt()


def eSelLine(self, nb=1):
"""étend la sélection aux nb lignes en-dessous, et retourne la
sélection
"""
args2=
self.doc.createInstance("com.sun.star.beans.PropertyValue")
args2[0].Name= "Count"
args2[0].Value= 1
args2[1].Name= "Select"
args2[1].Value= False

self.doc.GoDown("", 0, args2)
return self.filterTxt()


def eSelEndLine(self):
"""étend la sélection jusqu'à la fin de la ligne, et retourne
la sélection
"""
self.w.Selection.EndKey(self.wdLine, self.wdExtend)
return self.filterTxt()


def chRemplAll(self, oldchaine, newchaine=''):
"""
oldchaine = chaine a remplacer / string to replace
newchaine = chaine de remplacement / string for replace
"""
orempl=self.doc.createReplaceDescriptor()
orempl.SearchString=oldchaine
orempl.ReplaceString=newchaine
orempl.SearchWords = False #mots entiers seulement ?
orempl.SearchCaseSensitive = True #sensible à la casse ?
nb = self.doc.replaceAll(orempl)


def chRemplLstAll(self, lst=[[]]):
"""
oldchaine = chaine a remplacer / string to replace
newchaine = chaine de remplacement / string for replace
"""
nb=0
for oldchaine, newchaine in lst:
orempl=self.doc.createReplaceDescriptor()
orempl.SearchString=oldchaine
orempl.ReplaceString=newchaine
orempl.SearchWords = False #mots entiers seulement ?
orempl.SearchCaseSensitive = True #sensible à la casse ?
nb += self.doc.replaceAll(orempl)


def chRemplOne(self, oldchaine, newchaine=''):
"""
oldchaine = chaine a remplacer / string to replace
newchaine = chaine de remplacement / string for replace
"""
sel = self.w.Selection
#sel.ClearFormatting()
sel.Find.Text = oldchaine
sel.Find.Forward = True
newchaine=newchaine.replace('n','r')
sel.Find.Execute(
oldchaine,False,False,False,False,False,True,self.wdFindContinue,False,newchaine,self.wdReplaceOne)
self.position=sel


def chRemplClipboard(self, oldchaine):
"""
oldchaine = chaine a remplacer / string to replace
"""
sel = self.w.Selection
#sel.ClearFormatting()
sel.Find.Text = oldchaine
sel.Find.Forward = True

sel.Find.Execute(
oldchaine,False,False,False,False,False,True,self.wdFindContinue,False,'XXX',self.wdReplaceOne)
sel.Paste()
self.position=sel


def chRemplGraf(self, oldchaine, fichier):
"""
oldchaine = chaine a remplacer / string to replace
"""
sel = self.w.Selection
#sel.ClearFormatting()
sel.Find.Text = oldchaine
sel.Find.Forward = True

sel.Find.Execute(
oldchaine,False,False,False,False,False,True,self.wdFindContinue,False,'',self.wdReplaceOne)
sel.InlineShapes.AddPicture(fichier, False, True)
self.position=sel


def TableauInsLigApres(self, oldchaine, nblig=1):
"""
oldchaine = chaine a remplacer / string to replace
"""
sel = self.w.Selection
#sel.ClearFormatting()
sel.Find.Text = oldchaine
sel.Find.Forward = True

sel.Find.Execute(
oldchaine,False,False,False,False,False,True,self.wdFindContinue,False,'',self.wdReplaceOne)
sel.InsertRowsBelow(nblig)


def TableauDelLig(self, oldchaine):
"""
oldchaine = chaine a remplacer / string to replace
"""
sel = self.w.Selection
#sel.ClearFormatting()
sel.Find.Text = oldchaine
sel.Find.Forward = True

sel.Find.Execute(
oldchaine,False,False,False,False,False,True,self.wdFindContinue,False,'',self.wdReplaceOne)
sel.Rows.Delete()


def MoveRight(self, nb=1):
self.position.MoveRight(self.wdCharacter, nb)


def MoveLeft(self, nb=1):
self.position.MoveLeft(self.wdCharacter, nb)


def TableauMoveRight(self, nb=1):
sel = self.w.Selection
sel.MoveRight(self.wdCell, nb)


def TableauMoveLeft(self, nb=1):
sel = self.w.Selection
sel.MoveLeft(self.wdCell, nb)


def TableauMoveLine(self, nb=1):
sel = self.w.Selection
if nb>0:
sel.MoveDown(self.wdLine, nb)
else:
sel.MoveUp(self.wdLine, -nb)


def TableauCellule(self, lig=1, col=1, txt='', align=0):
tbl = self.doc.Tables[0]
cellule = tbl.Cell(lig, col)
cellule.Range.Text = txt
cellule.Range.ParagraphFormat.Alignment = align #0,1,2, left,
center, right


def landscape(self):
"""Met le document en mode paysage
"""
self.wdOrientLandscape=1
self.wdOrientPortrait=0
self.w.ActiveDocument.PageSetup.Orientation =
self.wdOrientLandscape


def portrait(self):
"""Met le document en mode portrait
"""
self.wdOrientLandscape=1
self.wdOrientPortrait=0
self.w.ActiveDocument.PageSetup.Orientation =
self.wdOrientPortrait


def changePrinter(self, printerName):
"""Change l'imprimante active de Word
"""
self.w.ActivePrinter = printerName





if __name__=='__main__':

w=word('C:LET01.odt')
w.chRemplAll('.NOM.','Tartempion')
w.wprint2()
w.quitCancel()


"""
contenu=w.eSelAll()
#w.wprint()
print w.chExist("Monsieur")
time.sleep(1)
w.saveas('C:/tutu.odt')
w.quit()
#w.quitCancel()


#print
#print contenu

#copyToClipboard and pasteFromClipboard
"""

--
@-salutations

Michel Claveau
Avatar
Michel Claveau
Re !

Je précise qu'il s'agit d'un code "brut", non épuré.
Il y a des morceaux de code qui ne fonctionnent pas, bien qu'ils soient
conformes aux spécifs ; d'ailleurs, ça fonctionne en VBscript, mais
pas en Python (on tombe sur des bugs connus de OOo).

--
@-salutations

Michel Claveau
1 2