2012-02-01 13 views
6

Così ho sperimentato con numpy e matplotlib e sono incappato in qualche bug durante l'esecuzione di python dalla shell inferiore di emacs.Emacs Shell inferiore a Python che non mostra prompt dopo il comando di matplotlib show()

Quando invio il file py all'interprete di shell, posso eseguire comandi dopo l'esecuzione del codice. Il prompt dei comandi ">>>" sembra corretto. Tuttavia, dopo aver richiamato un comando show matplotlib su un grafico, la shell si blocca semplicemente con il prompt dei comandi non mostrato.

>>> plt.plot(x,u_k[1,:]); 
[<matplotlib.lines.Line2D object at 0x0000000004A9A358>] 
>>> plt.show(); 

Sto eseguendo l'implementazione C-python tradizionale. sotto emacs 23.3 con Python di Fabian Gallina python.el v. 0.23.1 su Win7.

Una domanda simile è stata sollevata qui sotto la piattaforma i-python: running matplotlib or enthought.mayavi.mlab from a py-shell inside emacs on windows

UPDATE: ho duplicato il problema su un instalation fresca di Win 7 x64 con la tipica pitone 2.7.2 binari disponibili dal sito web python e con numpy 1.6.1 e matplotlib 1.1.0 su emacs 23.3 e 23.4 per Windows.

Ci deve essere un errore da qualche parte nella shell di emacs.

+0

Inoltre, se eseguo gli stessi comandi nell'ambiente python avviato dalla shell dei comandi di Windows, tutto funziona correttamente. Quindi è solo il pitone inferiore di emacs che mi sta dando problemi. – octi

+0

Avete provato a usare 'ansi-term' o' eshell' Ricordo di aver letto che alcune applicazioni non amano il reindirizzamento IO che 'M-x shell' fornisce. Per una panoramica vedi questo [articolo su shell alternative] (http://www.masteringemacs.org/articles/2010/11/01/running-shells-in-emacs-overview/). –

+0

come dovrei specificare in emacs per python per essere eseguito all'interno di eshell o di ansi-term invece della shell invocata tramite shell M-x? Non ho visto un luogo in cui il tutorial lo specificasse. – octi

risposta

0

penso che questo potrebbe avere qualcosa a che fare con il comportamento della funzione di spettacolo:

matplotlib.pyplot.show(*args, **kw)

Durante l'esecuzione in ipython con la sua modalità pylab, visualizzare tutte le figure e ritorno alla ipython richiesta.

In modalità non interattiva, visualizzare tutte le cifre e il blocco finché le cifre sono state chiuse; in modalità interattiva non ha alcun effetto a meno che le figure siano state create prima di passare dalla modalità interattiva non interattiva a (non consigliato). In tal caso visualizza le figure ma non blocca.

Un singolo argomento parola chiave sperimentale, blocco, può essere impostato su True o Falso per sovrascrivere il comportamento di blocco descritto in precedenza.

Penso che la tua esecuzione nel comportamento di blocco di cui sopra che comporterebbe l'impiccagione della shell. Forse prova a eseguire la funzione come: plt.show(block = False) e verifica se produce l'output che ti aspetti. Se questo ti sta ancora dando problemi fammelo sapere e proverò a riprodurre il tuo setup localmente.

+0

Così ho sperimentato i suggerimenti, ma sto ancora ottenendo comportamenti strani. Quindi il prompt dei comandi ritorna fino a quando invoco la funzione matplotlib.pyplot.plot. Dopo di che appende appena '>>> print ('ciao')' ' hello' ' >>> plt.ion() '' >>> print ('ciao') '' hello' ' >>> plt.plot (x, psi ** 2) ' ' [] ' ' >>> stampa ('hello') ' – octi

+0

Sei sicuro di essere lo stesso versione di Python con la stessa variabile di ambiente PYTHONPATH nella shell esterna a Emacs e da Emacs? Puoi controllare il percorso con 'print sys.path'. Dopo averlo controllato, forse controllare che cosa backend stai usando aiuta. Basta fare 'print matplotlib.rcParams ['backend']'. – tkf

+0

L'ho fatto sia nella shell di Windows che nella shell di emacs e viene utilizzato lo stesso PYTHONPATH. facendo i rcParams entrambi restituiscono TkAgg. Significa qualcosa? – octi

1

Penso che ci siano due modi per farlo.

  1. Utilizzare ipython. Quindi è possibile utilizzare l'opzione -pylab. Io non uso python.el di Fabian Gallina, ma credo che avrete bisogno di qualcosa di simile:

    (setq python-shell-interpreter-args "-pylab") 
    

    Si prega di leggere la documentazione di python.el.

  2. È possibile attivare manualmente la modalità interattiva ion

    >>> from matplotlib import pyplot as plt 
    >>> plt.ion() 
    >>> plt.plot([1,2,3]) 
    [<matplotlib.lines.Line2D object at 0x20711d0>] 
    >>> 
    
+0

quindi la parte di codice sopra funziona ma quando provo a stampare ('ciao') subito dopo il blocco del comando. Qualcuno può duplicare il mio problema? – octi

+0

Questo è strano ... Forse non lievitato, ma inizi a pitone con la stessa opzione? Puoi controllarlo stampando 'sys.argv' nella shell di emacs e nella shell di Windows. – tkf

+0

Entrambi gli argomenti sono [''] – octi

0

Credo di aver trovato un modo ancora più semplice per appendere il guscio inferiore, ma solo quando pdb viene richiamato. Avvia pdb fornendo "python" come programma da eseguire.

Prova di questo codice:

print "> {<console>(1)<module>() }" 
+1

L'obiettivo qui è non appendere il guscio inferiore ma in realtà impedirlo di appenderlo: P È questo che intendevi dire? – octi

0

Beh, dopo un enorme quantità di tempo e di distacco il bug sulla pagina del progetto matplotlib e la pagina python-mode ho scoperto che fornendo il --matplotlib console argomenti in ipython bat farà il trucco con matplotlib 1.3.1 e 1.2.0 ipython

Questo è quello che ho nel mio iphython.bat

@ python.exe -i D: \ devel \ Python27 \ Scripts \ ipython -script.py console --matplotlib% *

Problemi correlati