Terminal OS-X zachowuje się dziwnie po interaktywnym uruchomieniu Pythona

11

Po uruchomieniu replika python (2.7.10) w terminalu os-x i wyjściu, terminal nie wpisuje już echa danych wejściowych i zdarzają się inne dziwne rzeczy. Jeśli uruchomię pythonponownie exit(), a terminal wydaje się być przywrócony. Teraz tylko zamykam kartę i otwieram nową, więc nie testowałem tego dokładnie.

Wydaje mi się, że jest to związane z ustawieniami terminali, ale jest to ostatnia rzecz i nie zmieniłem niczego, co pamiętam. Python jest instalowany macports, jeśli istnieje coś wspólnego z niepasującymi zależnościami z biblioteką konsoli. 2.7.10 został zainstalowany jakiś czas temu i nie stało się to po instalacji.

Pęka kłykcie i otwiera sięterminal

[~]: virtualenv-2.7 venv-test
[~]: source venv-test/bin/activate
[~]: python
>>> ^D>>>       *(press ctrl-d, the 2nd >>> is strange)
[~]:            *(type something like `ls-l`, nothing shows on console)
[~]: -bash: ls-l: command not found`

Ponadto ponowne uruchomienie Pythona i naciśnięcie ctrl-dpowoduje wyświetlenie tych danych wyjściowych:

>>> ^D           (ctrl-d, then hit enter, doesn't exit)
>>> ^D           (...)
>>> ^D           (...)
>>> exit()       (typing exit() quits the session)
>>> [~]: 
Andrew Backer
źródło
Dlaczego instalujesz Python za pośrednictwem Macports? Python v2.7.10 jest dołączony do El Cap i myślę, że Yosemite ... Czy jest coś szczególnego, co otrzymujesz z portów Mac?
Benjamin Schollnick,
Cóż, używając 2.7. Czegoś większego niż to, co zostało dostarczone z Mac. Nie dotykając Pythona systemowego (standardowy problem w systemach Unix), działającego w wersji 2.7 z wkompilowanymi niestandardowymi opcjami GIS, z pakietem mgmt dla nich, a także 3.4 w tym samym czasie. Ale prawdziwym powodem, dla którego powinieneś to zrobić, jest nie fsck z pythonem systemowym.
Andrew Backer,
Czy aplikacja python zarządza jakimś oknem? (np. Korzystanie z przekleństw, NCurses itp.)
Benjamin Schollnick,
Nie ma aplikacji, wystarczy pisać, pythona potemctrl-d
Andrew Backer,

Odpowiedzi:

12

W MacPorts występuje otwarty błąd dotyczący tego problemu:

https://trac.macports.org/ticket/48807

Mówi, że instalacja Pythona z opcją „+ readline” rozwiązuje problem, który zweryfikowałem, robiąc to sam.

sudo port uninstall python27
sudo port install python27 +readline
B. Plaża
źródło
9
Cholera, dziękuję za znalezienie tego raportu o błędzie. FWIW, Nie można odinstalować Python27 (normalnie zależy od niego zbyt wiele pakietów), więc zamiast tego powinieneś przebudować. Uruchom sudo port selfupdate && sudo port clean python27 && sudo port install python27 +readline. Jeśli Twoje drzewo lokalne jest nieaktualne, nie będzie dostępny wariant + readline; selfupdatebędzie naprawić.
Andrew Backer,
8

Tryby terminalu są ustawiane przez aplikację na raw lub cbreak, a przy nieprawidłowym wychodzeniu tryby nie są przywracane. W szczególności funkcja odwzorowująca Enterklucz (control / M aka return karetki) na nową linię (control / J aka line feed) jest często w tym przypadku wyłączona. Możesz rozwiązać problem ze zwrotami, wprowadzając

stty sane

śledzony przez controlJ

Pozwoli to przynajmniej na ponowne wprowadzenie poleceń, chociaż znaki edycyjne, takie jak, backspacemogą nie zostać przypisane do ich zwykłych funkcji.

Niektórzy mogą również zalecić użycie resetpolecenia, ale podane objawy nie są istotne dla tego, co robi ten program.

Do dalszego czytania

Thomas Dickey
źródło
stty echowydaje się rozwiązać problem ( stackoverflow.com/questions/32475928/python3-messes-up-terminal ). Nie jestem pewien, czy to wszystko załatwi. Myślę, że coś jest trochę nie tak z moim pythonem, ponieważ błędy składniowe wymagają ode mnie ręcznego naciśnięcia nowego wiersza, aby zacząć wprowadzać nowe polecenie, i nie powinno tak być.
Andrew Backer,
Chociaż to nie rozwiązuje problemu, przynajmniej pozwala mi to naprawić po fakcie. Na razie mi to wystarcza. Jeśli jest jakiś sposób, aby dowiedzieć się, dlaczego tak się dzieje, chciałbym wiedzieć.
Andrew Backer,