web-dev-qa-db-fra.com

Existe-t-il "Modifier et continuer" dans PyCharm? Recharger le code dans le programme en cours d'exécution comme dans Eclipse / PyDev?

Salut à tous Python développeurs!

Dans Eclipse avec PyDev, il est possible de modifier un fichier Python pendant le débogage. Lors de l'enregistrement, le débogueur PyDev rechargera le code mis à jour dans le programme en cours d'exécution et utilisera mon nouveau code. Comment puis-je faire le même chose dans JetBrains PyCharm (en utilisant Community Edition)?

Eclipse/PyDev écrit une sortie comme celle-ci lorsque je fais cela:

pydev debugger: Start reloading module: "MyWidget" ... 
pydev debugger: Updated function code: <function close at 0x055F4E70>
pydev debugger: reload finished

J'ai recherché les paramètres et le Web et je n'ai trouvé aucun indice. Très content de toute idée. THX.

Edit: j'ai découvert dans Eclipse/PyDev qu'il fallait être en mode débogage pour pouvoir utiliser cette fonctionnalité. J'ai testé dans PyCharm, mais aucun rechargement n'a été effectué.

50
this.myself

Après tout, j'ai trouvé une solution de contournement utile et acceptable pour ma question. Il fonctionne dans PyCharm Community Edition 3.1.2 et je suppose que cela fonctionnera également dans l'édition commerciale. J'ai testé sur un projet de taille moyenne en utilisant Python 2.7.6, PySide (Qt) avec une fenêtre principale et plus de 20 widgets, onglets, etc.) Suivez ces étapes ...

  1. Travailler dans Pycharm sur un projet python :-)
  2. Exécutez votre code en mode débogage (vous n'avez pas essayé la version jusqu'à présent)
  3. Modifiez du code dans l'un de vos modules importés pendant la durée de vie de votre programme
  4. Faites suspendre votre programme. Pour ce faire, vous pouvez cliquer sur le bouton "Pause" de la vue Débogage de PyCharms puis sur n'importe quel endroit de la fenêtre principale de vos applications où il aurait besoin de faire quelque chose (par exemple sur un en-tête d'onglet). Si vous avez une longue tâche en cours et aucune interface utilisateur, vous pouvez placer un point d'arrêt à un endroit où votre programme vient souvent.
  5. Dans la vue Débogage, basculez vers l'onglet Console. Il y a un bouton à gauche Afficher la ligne de commande. Cliquez ici.
  6. Dans la console, tapez reload (MyModifiedModule) si cet appel échoue, écrivez import MyModifiedModule et réessayez.
  7. Cliquez sur reprendre dans PyCharm.
  8. Essayez le code que vous avez fixé.

PyCharm Debug View

Il y a quelques restrictions à cela ... Cela ne corrigera pas les changements dans votre méthode principale ou fenêtre principale, car il ne sera pas recréé. Dans mes tests, je n'ai pas pu recharger les widgets de Qt. Mais cela a fonctionné pour des classes comme les conteneurs de données ou les travailleurs.

Que la force soit avec vous pendant que vous essayez ceci et n'hésitez pas à ajouter vos expériences.

Je vous remercie.

19
this.myself

PyCharm ne prend pas en charge l'édition et la poursuite dans l'édition communautaire ou l'édition professionnelle, mais voici une solution de contournement que j'ai trouvée lors du débogage.

Étant donné que vous pouvez exécuter du code arbitraire dans la console et/ou l'évaluateur d'expression, dans de nombreux cas, vous pouvez exécuter des modifications du code sans avoir à redémarrer l'application. Ce n'est pas exactement comme modifier et continuer (qui est une fonctionnalité que j'aime vraiment dans Visual Studio et qui devrait faire partie de Pycharm), mais cela évite d'avoir à redémarrer le programme à partir de zéro après un changement pour voir si le nouveau code fonctionne comme prévu.

Permettez-moi d'illustrer quelques-unes des techniques que j'utilise:

Disons que vous avez le code suivant (avec quelques fautes de frappe/bugs pour illustrer les techniques)

test_value = [10,9,8,7,6,55,4,3,2,1]

for i in range(0,10):
    if test_value[i] == i:
        print "found the value: " + i

Si vous exécutez ce code, il contient d'abord des erreurs car vous ne pouvez pas imprimer la chaîne plus un entier, mais je voulais également faire correspondre 5, ne pas avoir 55 dans le tableau. Alors c'est parti.

Définissez un point d'arrêt sur l'instruction for comme ceci et exécutez le code dans le débogueur.

enter image description here

Lorsqu'il pénètre dans le débogueur, vous vous rendez compte qu'il doit être 5 et non 55. Plutôt que de redémarrer, vous pouvez remplacer la ligne 1 par test_value = [10,9,8,7,6,5,4,3,2,1] puis sélectionnez la ligne, faites un clic droit et choisissez Exécuter la ligne dans la console ... ce qui changera la valeur de test_value pour être le tableau avec un 5. Maintenant, l'instruction if sur la ligne 4 devient vraie sur la valeur 5. Cela déclenchera alors l'erreur de syntaxe à la ligne 5.

Maintenant, si vous voulez vous assurer que la syntaxe est correcte, vous pouvez remplacer la ligne 5 par print "a trouvé la valeur:" + str (i), sélectionnez la ligne et choisissez Évaluer l'expression ... dans le menu contextuel du bouton droit. Lorsque vous cliquez sur Évaluer, le résultat s'affiche soit dans la boîte de dialogue (ou dans ce cas, puisqu'il s'agit d'une commande d'impression, dans la console)

enter image description here

Maintenant que j'ai résolu ces deux problèmes, je peux exécuter le code avec succès lors de la deuxième passe plutôt que éventuellement plusieurs passes qu'il aurait pu prendre si je n'avais pas utilisé ces techniques. Ces techniques sont vraiment payantes si vous trouvez un bogue profondément dans le code où il a fallu du temps pour le configurer.

Évidemment, ceci est un exemple très artificiel, mais j'espère que cela montre comment vous pouvez utiliser à la fois Évaluer l'expression ... et Exécuter la ligne dans la console ... à votre avantage lors du débogage sans avoir à redémarrer votre application chaque fois que vous trouvez un bogue dans le code.

De plus, si vous utilisez Django, PyCharm (professionnel) relancera le serveur si vous apportez des modifications au code. Donc, si vous consultez votre page Web et remarquez un problème, vous pouvez modifier le code et revenir à la page Web et, comme vous le faites, l'application en cours d'exécution ou l'application déboguée redémarrera et le nouveau code s'exécutera lorsque vous actualiserez la page. Encore une fois, pas vraiment modifier et continuer, mais un moyen assez rapide pour effectuer un changement et tester.

23
andrewmo

J'ai la version commerciale de PyCharm et j'ai juste essayé de tester un simple script python. Le script est le suivant:

for i in range(0,100):
    print i

J'ai exécuté le code en mode débogage et placé un point d'arrêt à l'instruction "print i". Lorsque le débogueur s'est arrêté lors de la première itération, j'ai changé le code pour qu'il ressemble à ceci:

for i in range(0,100):
    print i
    print 'hello'

PyCharm n'a pas rechargé/recompilé le script modifié. Compte tenu de ce test simple, ma meilleure supposition serait que PyCharm ne recharge pas dynamiquement les fichiers .py.

5
drsnark