2009-06-16 9 views
3

Avant de commencer, je vous demande à tous de vous excuser pour la question. Peut-être que c'est stupide, mais je ne trouve pas de solution. Je travaille sur une machine distante, et je n'ai aucune idée de quel type.Python - Impression sur stdout sur un "terminal"

Mon code python, qui semble fonctionner, est celui ci-dessous. Le problème est que j'essaie d'imprimer quelques sorties sur l'écran mais rien ne se passe. J'ai essayé à la fois print et raw_input mais rien ne se passe ... Connaissez-vous un autre moyen de le faire?

# Set up fields of reply message based on query 
def prepareReply(): 
    global authorReply, authorReplyLen, localConvId, originConvId, blbContentAndUntUnz, linkName 

    print "PLOP!" 
    raw_input("blabla") 

    #print "="*10 

Merci!

+0

impressions d'impression à la sortie standard - le problème doit être quelque part ailleurs. Quelle version python utilisez-vous? –

+0

2.4 Est-il possible que la stdout soit redidercted ailleurs par défaut ?? – wheisenberg

+0

Il est possible de rediriger stdout, mais je ne pense pas que cela soit fait par défaut. J'ai utilisé la redirection pour la journalisation dans des circonstances où je n'avais pas accès à stdout. –

Répondre

4

Pour rediriger stdout à quelque chose que vous pouvez lire, un fichier dans ce cas:

class PyLogger: 

    def __init__(self, source): 
    self.file_handle = open('Python_Log.txt', 'a') 
    self.source=source 
    self.buf = [] 

    def write(self, data): 
    self.buf.append(data) 
    if data.endswith('\n'): 
     self.file_handle = open('Python_Log.txt', 'a') 
     self.file_handle.write('\t' * indent_level) 
     self.file_handle.write(self.source + "::" + ''.join(self.buf)) 
     self.file_handle.close() 
     self.buf = [] 

    def __del__(self): 
    if self.buf != []: 
     self.file_handle = open('Python_Log.txt', 'a') 
     self.file_handle.write('\t' * indent_level) 
     self.file_handle.write(self.source + "::" + ''.join(self.buf) + '\n') 
     self.file_handle.close()  
    self.file_handle.close() 

import sys 
sys.stdout = PyLogger('stdout') 
sys.stderr = PyLogger('stderr') 
+0

On dirait que le premier open() et close() dans write() et __del __() sont superflus. Ou vouliez-vous faire self.file_handle.flush()? De plus, file_handle pourrait vraiment être un attribut de classe au lieu d'un attribut d'instance, puisqu'il est partagé par toutes les instances. – EOL

+0

C'est un simple copier-coller d'un «code qui fonctionne» auquel je n'ai pas pensé depuis longtemps, probablement originellement sur Internet quelque part. Vous pourriez bien avoir raison qu'une grande partie du code est superflue. –

2

Ceci est une conjecture, mais en regardant le libellé de vos commentaires, il est possible que ce soit une application de serveur Web (indice: plus de détails sur votre environnement serait utile). Dans ce cas, stdout va probablement ailleurs, du moins pas dans le navigateur.

Comment exécutez-vous réellement ce code? Tapez-vous "python myprogram.py" à l'invite du shell ou utilisez Reload dans votre navigateur?

+0

l'application fonctionne sur un serveur, mais pas un serveur web! C'est un serveur particulier qui traite les transactions ... Pour exécuter le programme python, je dois exécuter un script shell qui exécute mon application python! Je n'ai aucune idée que le script shell est fait ... – wheisenberg

+1

Eh bien, il semble que vous fassiez déjà ce que l'on peut attendre d'un point de vue Python. Puisque votre script est exécuté par un autre framework que nous ne connaissons pas, stdout pourrait être redirigé n'importe où. Une chose que vous pourriez essayer est: out = open ("/ dev/tty", "w"); print >> out, "hello world" –

+1

S'il fonctionne avec un peu de framwework, peut-être 'return" PLOP! – uolot

9
import sys 
print "Hi!" 
sys.stdout.flush() 
Questions connexes