2014-11-23 15 views
15

sto usando PyCharm 4, con la boccetta 0.10.1, Python 3.4PyCharm e pallone autoreload e punti di interruzione non funzionano

Sembra che durante l'esecuzione di un'applicazione pallone da dentro PyCharm, se l'eseguo con:

app.run(debug=True) 

I miei punti di interruzione sono ignorati. Dopo un po 'googling, ho trovato che per fare tappa PyCharm su punti di interruzione, dovrei correre pallone con:

app.run(debug=True, use_reloader=False) 

Ora PyCharm ferma correttamente su punti di interruzione, ma mi manca la caratteristica autoreloading.

C'è un modo per far funzionare entrambi insieme?

EDIT: con Python 2.7 e due le cose funzionano

+0

Prova 'debug = FALSE lasciando' use_reloader' al suo valore predefinito. – davidism

+0

@davidism, facendo in modo che né i punti di interruzione né il ricaricamento automatico funzionino. – Matt

+1

La documentazione di Flask consiglia vivamente di non usare Python 3 in questa fase: http://flask.pocoo.org/docs/0.10/advanced_foreword/#the-status-of-python-3 – Kash

risposta

1

Il problema è che con use_reloader=True l'applicazione Werkzeug viene avviato in un separato (bambino) filo di applicazione principale e PyCharm non riesce a gestire correttamente i punti di interruzione perché sono persi quando il inizia il thread

Si può provare a seguire questa discussione: http://forum.jetbrains.com/thread/PyCharm-776 ma sembra che non ci siano stati troppi progressi.

Io suggerirei di usare qualcosa di Python-ish come pdb, vale a dire:

@app.route('/<string:page>') 
def main(page): 
    import pdb; pdb.set_trace() # This line actually stops application execution 
           # and starts Python debug shell in the console 
           # where you can examine current scope and continue 
           # normal code execution at any time. 
           # You can inject *any* code here. 
           # For example, if you type `print page` during pause, 
           # it will output content of "page" variable. 
    return render_template('index.html') 
+0

Tranne questo è il Python debugger, non il debugger PyCharm. – davidism

+0

@davidism è giusto, ma sfortunatamente PyCharm sembra succhiare a questo punto :(Sto usando PyCharm anche io, e mi piace, ma non ho mai usato il suo debugger –

+0

Il mio punto era che questa non è una risposta Il debugger PyCharm è fantastico, non funziona bene con il reloader, sembra più utile dire "spegnere il reloader e usare il potentissimo debugger di PyCharm" piuttosto che "usare questo debugger di base che ha questo punto di ingresso ". – davidism

16

ho intenzione di iniziare con la risposta breve: No, ciò che si vuole non può essere fatto con qualsiasi release di PyCharm up a 4.0.1.

Il problema è che quando si utilizza il reloader, l'applicazione Flask viene eseguita in un processo figlio, quindi il debugger PyCharm è collegato al processo master e non ha alcun controllo sul figlio.

Il modo migliore per risolvere questo problema, a mio parere, è chiedere a Jetbrains di creare una funzionalità di "riavvio sul cambiamento" nel proprio IDE. Quindi non è necessario utilizzare il caricatore di Werkzeug e si ottiene la stessa funzionalità direttamente da PyCharm.

Fino a quando Jetbrains non decide di implementarlo, posso condividere la mia soluzione alternativa, che non è terribilmente male.

  • In "Modifica configurazioni", impostare la configurazione che si intende utilizzare per "Single Instance solo" (casella di controllo in alto a destra della finestra di dialogo)
  • Assicurarsi che la configurazione è quello attivo .
  • Configura la tua app Flask per non utilizzare il reloader di Werkzeug.
  • Premere Ctrl-D per avviare il debug (su Mac, altri potrebbero avere un collegamento diverso)
  • I punti di interruzione dovrebbero funzionare correttamente perché il reloader non è attivo.
  • Apporta le modifiche necessarie al codice.
  • Quando sei pronto per il riavvio, premi nuovamente Ctrl-D. La prima volta che lo fai riceverai un messaggio di conferma, qualcosa come "fermati e riavvia?". Dì di si e seleziona la casella di controllo "non mostrare più".
  • Ora è possibile premere Ctrl-D per riavviare rapidamente il debugger ogni volta che è necessario.

Sono d'accordo che non è perfetto, ma una volta che il Ctrl-D entra nella memoria muscolare non ci penserai nemmeno.

Buona fortuna!

+0

Ma perché i punti di interruzione funzionano a volte con autoregolazione? – Vladislav

+0

Lavorano sul processo principale, non sul bambino. – Miguel

-1

da PyCharm 2017 utilizzando python 2.7 (nel mio caso con env virtuale, ma io non suppongo necessario) che faccio:

  • run ...
  • script lasciare e parametri script vuote
  • I mettere in opzioni interprete: -m run pallone
  • impostare le variabili env FLASK_APP

  • che correre allegare al processo locale, e, infine, scegliere il t egli esecuzione processo

il mio caso d'uso è quello di collegare da postino a pallone endpoint servizi REST e interrompere i miei punti di interruzione

Problemi correlati