¿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"

Author: RichVel, 2011-08-09

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 y netstat 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.

 97
Author: John Mee,
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.

  1. Ahora mismo pip install pydevd me funcionó tanto en ubuntu como en centos 6
  2. 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

  1. 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".
 7
Author: Sergey,
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.

 1
Author: Dmitry Trofimov,
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