2010-10-10 17 views
4

J'essaie actuellement d'envoyer des données binaires via pexpect. Pour une raison quelconque, les données passent à travers juste trouver, sauf pour un 0x04, qui est simplement ignoré. J'ai suivi l'appel pexpect pour déterminer que tout ce qui se passe est un appel os.write() à un descripteur de fichier ouvert à partir d'une commande pty.fork().Caractères ne passant pas d'un pseudo-terminal maître à un esclave

Des idées?

(code exemple qui illustre le problème)

import os, pty, sys 


pid, child_fd = pty.fork() 

if pid: # Parent 
    os.write(child_fd, b"'\x04hmm\x04'\n") 
    buf = os.read(child_fd, 100) 
    print buf 
else: # Child 
    text = sys.stdin.readline() 
    print ''.join(["%02X " % ord(x) for x in text]) 

de résultats:

$ python test.py 
'hmm' 
27 68 6D 6D 27 0A 
+0

En outre, le pilote pty fait l'écho local pour vous comme en témoigne le '' hmm' 'avant tout le reste. – Omnifarious

Répondre

2

0x04^est D, qui est la fin de fichier pression de touche. Est-ce que le pty a été réglé en mode brut? Peut-être que le conducteur le mange.

Si vous le faites:

os.write(child_fd, b"'\x04hmm\x16\x04'\n") 

vous pouvez voir qu'en effet, le conducteur fait la traduction. \x16 est le même que^V, qui est comment vous citez des choses. Il est logique que la traduction ne se produise que du maître (le prétendu terminal physique) et de l'esclave. Le terminal physique prétendu est l'endroit où (sur un périphérique terminal normal) la personne taperait

Je ne sais pas comment faire pour que le conducteur arrête de faire cela. Si l'enfant définit son terminal en mode brut, cela le fera probablement.

+0

En outre, je sais que vous pouvez envoyer ce personnage via stdin car si vous le passez par un appel "exec -e", il est très bien entré. – Rannick

+0

@Rannick - Faites un commentaire, puis réalisé qu'il ferait mieux comme une édition de réponse. – Omnifarious

+0

la pointe fonctionne pour ma situation particulière, je pense im jsut va écrire un pilote binaire qui cite toutes ces données afin que je puisse m'en tirer avec. Si vous ne sentez pas que la question est totalement résolue, je vais laisser cela ouvert, sinon, au moins pour mes objectifs, j'ai un chemin vers la fonctionnalité dont j'ai besoin de pexpect. – Rannick