¿Cómo puedo iniciar la depuración remota con PyCharm?
Estoy tratando de obtener la depuración entre PyCharm (en el host de Windows) y un host virtual de Debian que ejecuta mi aplicación django. Las instrucciones dicen instalar el huevo, agregar la importación y luego invocar un comando. ¿Asumo que estas cosas deben hacerse en el host de Debian?
Bien, entonces, ¿en qué archivo debo poner estas dos líneas?
from pydev import pydevd
pydevd.settrace('not.local', port=21000, stdoutToServer=True, stderrToServer=True)
Traté de ponerlo en el settings.py pero tengo este tipo de cosas...
File "/django/conf/__init__.py", line 87, in __init__
mod = importlib.import_module(self.SETTINGS_MODULE)
File "/django/utils/importlib.py", line 35, in import_module
__import__(name)
File "/settings.py", line 10, in <module>
pydevd.settrace('dan.local', port=21000, stdoutToServer=True, stderrToServer=True)
File "/pycharm-debug.egg/pydev/pydevd.py", line 1079, in settrace
debugger.connect(host, port)
File "/pycharm-debug.egg/pydev/pydevd.py", line 241, in connect
s = StartClient(host, port)
File "/pycharm-debug.egg/pydev/pydevd_comm.py", line 362, in StartClient
sys.exit(1)
SystemExit: 1
Mientras pycharm estaba sentado allí " esperando conexión"
3 answers
PyCharm (o su ide de su elección) actúa como el "servidor" y su aplicación es el "cliente"; por lo que inicia el servidor primero - dile al IDE que 'depure' - y luego ejecuta el cliente - que es un código con la instrucción settrace
en él. Cuando su código python golpea el settrace
se conecta al servidor - pycharm - y comienza a alimentar los datos de depuración.
Para hacer que esto suceda:
1. copie la biblioteca pydev
a la máquina remota
Así que tuve que copiar el archivo de C:\Program Files\JetBrains\PyCharm 1.5.3\pycharm-debug.egg
a mi máquina linux. Lo puse en /home/john/api-dependancies/pycharm-debug.egg
2. Poner el huevo en el PYTHONPATH
Espero que aprecies que no vas a poder usar el huevo a menos que python pueda encontrarlo. Supongo que la mayoría de la gente usa easy_install, pero en mi caso lo agregué explícitamente poniendo esto:
import sys
sys.path.append('/home/john/app-dependancies/pycharm-debug.egg')
Esto solo es necesario porque todavía no he tenido éxito instalando un huevo. Esta es mi solución.
3. configurar el servidor de depuración config
En PyCharm puede configurar el servidor de depuración a través de:
- Ejecutar-> Editar configuraciones : abre el diálogo' Ejecutar/Depurar configuraciones '
- Defaults - > "Python Remote Debug": es la plantilla a usar
- complete el nombre de host local y el puerto y probablemente querrá 'usar asignación de rutas', pero más sobre todo esto a continuación...
-
"OK"
Local host name: significa el nombre de la server - esa es la máquina host de Windows en mi caso - o en realidad la dirección IP de la máquina host de windows ya que el nombre de host no es conocido por mi máquina remota. Así que la máquina virtual (remota) tiene que ser capaz de llegar al host.
ping
ynetstat
son buenos para esto.Port : puede ser cualquier puerto vacante no privilegiado que desee. eg:
21000
es poco probable que esté en uso.No se preocupe por las asignaciones de rutas por ahora.
4. Iniciar el servidor de depuración
- Ejecutar-> Debug : inicie el servidor de depuración - elija la configuración que acaba de crear.
Aparecerá la pestaña de la consola de depuración y debería obtener
Starting debug server at port 21000
En la consola, lo que significa que el servidor de depuración ide está esperando que su código abra una conexión con él.
5. Insértese el código
Esto funciona dentro de una prueba unitaria:
from django.test import TestCase
class APITestCase(TestCase):
def test_remote_debug(self):
import sys
sys.path.append('/home/john/dependancies/pycharm-debug.egg')
from pydev import pydevd
pydevd.settrace('192.168.33.1', port=21000, suspend=False)
print "foo"
Y en una aplicación web django es un poco quisquilloso acerca de dónde lo pones-parece funcionar solo después de que todo lo demás está hecho:
if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings")
from django.core.management import execute_from_command_line
execute_from_command_line(sys.argv)
sys.path.append('/vagrant/pycharm-debug.egg')
import pydevd
pydevd.settrace('192.168.33.1', port=21000, suspend=False)
De nuevo que la dirección IP es la casilla donde está ejecutando Pycharm; debería poder hacer ping a esa dirección ip desde la casilla que ejecuta su código/sitio web. El puerto es su elección, solo asegúrese de haber dicho a pycharm que escuche en el mismo puerto. Y me pareció que el suspend=False
menos problemático que los valores predeterminados de, no solo se detiene inmediatamente por lo que no está seguro de si está funcionando, sino también tratando de transmitir a stdin / out que podría darle pena también.
6. Abre el cortafuegos
El firewall de Windows 7, de forma predeterminada, bloqueará la conexión entrante. Usando netstat en el host remoto podrá ver que SYN_SENT nunca se ESTABLECE, al menos no hasta que agregue una excepción al firewall de Windows para la aplicación 'pycharm'.
OS / X y Ubuntu no tienen firewalls para punch tiró (por defecto, alguien puede haber aplicado uno tarde).
7. Establezca un punto de interrupción y ejecute el código
Después de todo eso, cuando todo va según lo planeado, puede establecer un punto de interrupción, en algún lugar después de que se ejecute settrace, y la consola pycharm mostrará{[16]]}
Connected to pydev debugger (build 107.386)
Y bajo la pestaña 'Debugger' la pila de variables comenzará a funcionar y podrá pasar por el código.
8. Mappings
El mapeo indica a pycharm dónde puede encontrar el código fuente. Así que cuando el depurador dice " estoy ejecutando la línea 393 del expediente /foo/bar/nang.py, Pycharm puede traducir esa ruta absoluta remota en una ruta local absoluta... y mostrarte el código fuente.
/Users/john/code/app/ /opt/bestprice/app/
/Users/john/code/master/lib /opt/bestprice/lib/python2.7/site-packages
Hecho.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-14 04:11:38
Es solo una nota , en realidad , pero contiene información que puede ahorrar horas.
- Ahora mismo
pip install pydevd
me funcionó tanto en ubuntu como en centos 6 - Si realmente quieres depurar el servidor remoto que está detrás de firewals y esas cosas, puedes usar el siguiente truco:
Ssh - R 8081: localhost: 8081 [email protected]
Esto permite que el código remoto se conecte a su máquina escuchando en localhost: 8081
- Si es remoto debugger no quiere iniciar, diciendo que no puede encontrar el puerto de socket, compruebe las reglas del firewall. Tenga en cuenta que la regla con "127.0.0.1" no es lo mismo que "localhost".
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-16 15:28:43
Parece que por alguna razón debugger no pudo conectarse a su host de Windows con PyCharm. ¿No tienes otros mensajes en Stderr? Si no lo ha hecho, intente ejecutarlo una vez más, pero con sterrToServer=false. Eso puede mostrar una razón real por la que no se conecta.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-10 17:17:48