2015-03-10 13 views
14

Io uso PyCharm/IntelliJ edizioni della comunità da un Wile da scrivere e il debug degli script Python, ma ora sto cercando di eseguire il debug di un modulo Python , e lo fa PyCharm un parsing errato dell'istruzione della riga di comando, che causa un errore di esecuzione, o forse sto facendo una cattiva configurazione.Intellij/PyCharm può moduli Python non di debug

Questa è la mia configurazione di esecuzione/debug:

IntelliJ run/debug Python module configuration

E questo viene eseguito quando ho eseguito il modulo (nessun problema qui):

/usr/bin/python3.4 -m histraw 

Ma quando il debug, questo è l'output nella console IntelliJ:

/usr/bin/python3.4 -m /opt/apps/pycharm/helpers/pydev/pydevd.py --multiproc --client 127.0.0.1 --port 57851 --file histraw 
/usr/bin/python3.4: Error while finding spec for '/opt/apps/pycharm/helpers/pydev/pydevd.py' (<class 'ImportError'>: No module named '/opt/apps/pycharm/helpers/pydev/pydevd') 

Process finished with exit code 1 

Come si può vedere, i parametri sono analizzati in modo errato e dopo l'opzione -m viene passato uno script di debug IntelliJ prima del nome del modulo.

Ho provato anche appena messo -m histraw nel campoScrittura, ma non funziona, quel campo è solo quello di mettere i percorsi script Python, non moduli.

Qualche idea?

+0

Cosa stai cercando di ottenere esattamente eseguendo il tuo script usando il parametro -m e non direttamente? Per quanto ne so, l'opzione -m è stata progettata per semplificare l'esecuzione di moduli di libreria standard; non porta alcun vantaggio per i tuoi script. – yole

+1

Perché sto scrivendo uno * script di riga di comando distribuibile * ed è installabile nel tuo sistema 'PATH' come uno strumento da riga di comando eseguibile, con setuptools e pip tools. Quando si scrive una riga di comando reale in Python, 'setuptools' lo installa nell'ambiente di sistema con un nuovo script standalone, e ** questo script chiama il proprio script originale come un modulo **.Questo può sembrare innocuo quando il codice è in esecuzione, ma non lo è, perché il "ambiente" cambia e alcune parti del codice possono reagire in modo diverso, in particolare le istruzioni di importazione dei moduli o le chiamate al pacchetto sys. *, Ecc. – Mrdev

+0

Quindi perché non crei una copia di uno script che setuptools creerebbe, ed eseguirai lo script da una configurazione di esecuzione di PyCharm? – yole

risposta

16

C'è un altro modo per farlo funzionare. È possibile scrivere uno script Python per eseguire il modulo. Quindi basta configurare PyCharm per eseguire questo script.

import sys 
import os 
import runpy 
path = os.path.dirname(sys.modules[__name__].__file__) 
path = os.path.join(path, '..') 
sys.path.insert(0, path) 
runpy.run_module('<your module name>', run_name="__main__",alter_sys=True) 

Quindi il debugger funziona.

+0

Funziona molto bene, la modifica sys.path non è nemmeno necessaria in base al layout del progetto e alla configurazione della directory di lavoro. – toabi

+0

Come e dove configurare PyCharm per eseguire questo script? – slashdottir

+0

[Esegui -> Modifica configurazioni] Script: lo script sopra. Parametri dello script: tutti i parametri originali tranne "-m nome_modulo". – RyanLeiTaiwan

-2

Il problema è già risolto da PyCharm 4.5.2. Vedi il problema corrispondente nel tracker PyCharm: https://youtrack.jetbrains.com/issue/PY-15230

+1

Se non si commenta o si documenta come utilizzare una nuova funzione, è come se quella funzione non esistesse. Questo è il caso di quella correzione, ho provato di nuovo con PayCharm 4.5.3, e ho avuto lo stesso problema, ma non sono sicuro che fosse perché il problema non è stato risolto, o perché c'è una nuova funzionalità speciale per il debug di Python moduli, ma quella funzione non è documentata per sapere come usarla. – Mrdev

+0

Inoltre, il link qui menzionato indica un ticket che è stato riaperto; quindi il problema non è stato risolto. – Reinderien

1

Ho trovato più semplice creare un file di bootstrap (debuglaunch.py) con i seguenti contenuti.

from {package} import {file with __main__} 

if __name__ == '__main__': 
    {file with __main__}.main() 

Ad esempio, per lanciare locustio nel debugger PyCharm, ho creato debuglaunch.py ​​come questo:

from locust import main 

if __name__ == '__main__': 
    main.main() 

E PyCharm configurato come segue.

pycharm_debug_config

NOTA: ho scoperto che non ero in grado di passare al debugger a meno che non ho aggiunto un punto di interruzione main.main(). Questo potrebbe essere specifico per Locustio, comunque.