2015-08-06 14 views
11

Sto cercando di eseguire uno script di base Pexpect:Pexpect e PyCharm - ioctl non appropriato per il dispositivo

import pexpect 
ftp_process = pexpect.spawn('ftp') 
ftp_process.interact() 

Quando il codice viene eseguito direttamente da un terminale, il codice funziona come previsto. Se faccio funzionare il codice utilizzando del PyCharm run/debug ottengo il seguente errore:

Traceback (most recent call last): 
    File "/path/to/code/test.py", line 3, in <module> 
    ftp_process.interact() 
    File "/usr/local/lib/python3.4/site-packages/pexpect/__init__.py", line 1645, in interact 
    mode = tty.tcgetattr(self.STDIN_FILENO) 
termios.error: (25, 'Inappropriate ioctl for device') 

Sembra che il modo Pexpect interagisce con finestra di esecuzione/debug di PyCharm non funziona per impostazione predefinita. C'è un modo per porvi rimedio con una specifica impostazione PyCharm? In caso contrario, c'è un altro modo per aggirare questo problema?

EDIT

Il codice di cui sopra è semplicemente un esempio abbreviato che comporta il problema. Le altre capacità di pexpect (come expect(), sendline(), ecc.) Sono ancora desiderate.

+0

PyCharm deve fornire una pseudo-tty (pty) anziché una pipe, ad esempio, il codice viene eseguito correttamente all'interno di Emacs. Potresti provare 'pty.spawn ('ftp')' – jfs

+0

@ J.F.Sebastian, che è una risposta, funziona. –

+0

@ J.F.Sebastian: pty funziona per questo caso, ma questo è davvero solo un esempio semplificato. Ho ancora bisogno del potere di pexpect. Non vedo come rendere PyCharm una pseudo-tty, ma forse qualcuno che risponda a questa domanda lo saprà. – golmschenk

risposta

-1

Sembra che pexpect sia installato correttamente nell'installazione predefinita di Python, potrebbe esserci un'altra istanza python che potrebbe non avere la libreria pexpect installata o installata correttamente. Nelle tue impostazioni PyCharm prova a puntarlo sull'installazione python predefinita/corretta.

+0

Grazie per la risposta, ma questo non sembra accadere a causa di un problema con l'installazione Pexpect o quale interprete viene utilizzato da PyCharm. Sembra essere un problema con il modo in cui "terminale" del run/debug di PyCharm comunica con Pexpect. – golmschenk

0

Provare qualcosa che può assegnare Pseudo TTYs. Questo dovrebbe ingannare ftp nel pensare che abbia un TTY (che è qualcosa che viene dato quando si esegue REPL Python dal terminale). Esempio:

pexpect.pty.spawn('ftp') 

Si può anche provare ptyprocess anche se non posso garantire per la sua correttezza/di essere in uno stato di lavoro.

+0

Conosci qualche documentazione per la funzione 'pty_spawn'? Vedo solo il file di questo nome che contiene la funzione 'spawn' che sto già utilizzando e il tentativo di chiamare questa funzione si traduce in un oggetto' 'module '' ha nessun errore' attributo'. – golmschenk

+0

Spiacente, dovrebbe essere "pexpect.pty.spawn". – knight

+0

Questo ora genera il processo, ma in seguito non è possibile utilizzare altri comandi pexpect (expect, sendline, ecc.) Perché sembra che il programma stia aspettando il completamento della chiamata pty. Qualche idea su come permettere questo attraverso questo approccio? – golmschenk

2

Nota: questa è solo una soluzione, ma funziona.

Se lo script viene chiamato da una pseudo-tty utilizzando uno script separato, è possibile ottenere i risultati desiderati. Ad esempio, utilizzando pty.spawn("python my_script.py".split()) dove my_script.py è quello che utilizza pexpect.

Ho trovato ragionevole disporre di un singolo script che tenta le chiamate pexpect inizialmente all'interno di un try/except e al rilevamento dell'errore, lo script si richiama automaticamente all'interno di uno pseudo-tty.

Il credito va a J.F. Sebastian nei commenti della domanda originale.

Problemi correlati