2009-01-28 9 views
1

Voici un exemple du problème que je rencontre. J'utilise les extensions Python Win32 pour accéder à une boîte aux lettres Outlook et récupérer des messages.MS Outlook CDO/MAPI bloquant la sortie du fichier Python?

Voici un script qui devrait écrire "hello world" dans un fichier texte. J'ai besoin de récupérer des messages d'une boîte aux lettres Outlook et j'ai remarqué quelque chose d'étrange. Après je joindre à la boîte aux lettres une fois, je ne peux plus imprimer n'importe quoi dans un fichier. Voici une version dégrossi montrant le problème:

#!/usr/bin/env python 

from win32com.client import Dispatch 

fh = open('foo.txt', 'w') 
fh.write('hello ') 
fh.close() 

session = Dispatch('MAPI.session') 
session.Logon('','',0,1,0,0,'exchange.foo.com\nprodreport'); 
session.Logoff() 

fh = open('foo.txt', 'a') 
fh.write('world') 
fh.close() 

Si je n'attache à la boîte aux lettres et commenter les lignes suivantes, il fonctionne bien évidemment:

session = Dispatch('MAPI.session') 
session.Logon('','',0,1,0,0,'exchange.foo.com\ncorey'); 
session.Logoff() 

Pourquoi l'ouverture d'une séance à une boîte aux lettres au milieu de mon script bloquant la sortie de fichier supplémentaire? des idées? (d'autres opérations ne sont pas bloquées, juste ce fichier i/o asfaik)

Répondre

1

répondre à ma propre question. il semble que votre répertoire de travail soit modifié lorsque vous lisez l'e-mail. Si vous le réglez, votre fichier I/O fonctionne correctement.

le script correct ressemblerait à ceci:

#!/usr/bin/env python 

import os 
from win32com.client import Dispatch 

fh = open('foo.txt', 'w') 
fh.write('hello ') 
fh.close() 

cwd = os.getcwd() 

session = Dispatch('MAPI.session') 
session.Logon('','',0,1,0,0,'exchange.foo.com\ncorey'); 
session.Logoff() 

os.chdir(cwd) 

fh = open('foo.txt', 'a') 
fh.write('world') 
fh.close() 
1

Oui, le changement de répertoire est un Gotcha connu lors de l'utilisation CDO/MAPI. Il est "documenté" quelque part dans MSDN (par exemple http://support.microsoft.com/kb/269170). Vous pouvez le reproduire facilement en Python comme ceci:

 

import os 
import win32com.client 

print os.getcwd() 
win32com.client.Dispatch ("MAPI.Session") 
print os.getcwd() 
 
Questions connexes