2015-08-06 22 views
11

próbuję uruchomić podstawowego skryptu Pexpect:Pexpect i pycharm - Niewłaściwy ioctl dla urządzenia

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

Gdy kod jest uruchamiany bezpośrednio z terminala, kod działa zgodnie z oczekiwaniami. Jeśli uruchomić kod za pomocą pycharm Run/debug pojawia się następujący błąd:

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') 

Wydaje się, że jak Pexpect współdziała z oknem run/debugowania pycharm nie działa domyślnie. Czy jest jakiś sposób, aby temu zaradzić przy określonym ustawieniu PyCharm? Jeśli nie, czy jest jakiś inny sposób obejścia tego?

EDIT

powyżej Kod jest jedynie skrócona przykład co prowadzi do problemu. Inne możliwości pexpect (takie jak expect(), sendline(), itp.) Są nadal pożądane.

+0

PyCharm musi dostarczyć pseudo-tty (pty) zamiast potoku, np. Kod działa dobrze z poziomu Emacsa. Możesz spróbować 'pty.spawn ('ftp')' – jfs

+0

@ J.F.Sebastian, to jest odpowiedź, działa. –

+0

@ J.F.Sebastian: pty działa w tym przypadku, ale jest to po prostu uproszczony przykład. Nadal potrzebuję mocy pexpect. Nie widzę sposobu, aby PyCharm dostarczył pseudo-tty, ale być może ktoś, kto odpowie na to pytanie, będzie wiedział. – golmschenk

Odpowiedz

-1

Wygląda na to, że pexpect jest poprawnie zainstalowany w domyślnej instalacji Pythona, może istnieć inna instancja pythona, która może nie mieć zainstalowanej lub zainstalowanej poprawnie biblioteki pexpect. W ustawieniach PyCharm spróbuj wskazać domyślną/poprawną instalację pythona.

+0

Dziękuję za odpowiedź, ale wydaje się, że to nie dzieje się z powodu problemu z instalacją Pexpect lub z którego interpretera korzysta PyCharm. Wydaje się, że jest to problem związany z tym, jak "terminal" komunikacji run/debug z PyCharm komunikuje się z Pexpect. – golmschenk

0

Spróbuj czegoś, co może przydzielić Pseudo TTYs. To powinno oszukać ftp w myśleniu, że ma TTY (która jest podana, gdy uruchamiasz Python REPL z terminala). Przykład:

pexpect.pty.spawn('ftp') 

Możesz także spróbować ptyprocess chociaż nie mogę ręczyć za to Poprawność/będąc w stanie roboczym.

+0

Czy znasz jakąkolwiek dokumentację funkcji 'pty_spawn'? Widzę tylko plik o tej nazwie, który zawiera funkcję odradzania, której już używam, a próba wywołania tej funkcji powoduje, że obiekt '' module 'nie ma błędu atrybutu. – golmschenk

+0

Niestety, powinno to być 'pexpect.pty.spawn'. – knight

+0

To teraz odradza proces, ale inne polecenia pexpect (expect, sendline, etc) nie mogą być później użyte, ponieważ wydaje się, że program czeka na zakończenie wywołania pty. Wszelkie przemyślenia na temat tego, jak pozwolić na to poprzez takie podejście? – golmschenk

2

Uwaga: To jest tylko obejście problemu, ale działa.

Jeśli skrypt jest wywoływany z pseudo-tty za pomocą osobnego skryptu, można uzyskać pożądane wyniki. Na przykład, używając pty.spawn("python my_script.py".split()) gdzie my_script.py jest tym, który używa pexpect.

Zrozumiałem, że jest rozsądny mieć pojedynczy skrypt, który próbuje początkowo wywoływać połączenia pexpect w ciągu try/except, a po złapaniu błędu, skrypt wywołuje się wewnątrz pseudo-tty.

Kredyt trafia do J. Sebastiana w komentarzu do pierwotnego pytania.