ScriptUO
Scripting Resources & Utilities => Stealth Client => Topic started by: Boydon on February 19, 2012, 10:24:10 AM
-
Hello everyone,
I'm going to show how you can debug yours Stealth scripts written in Python using Pydev (http://pydev.org/).
If you have any question or something is not clear please let me know.
This guide has also been posted (http://stealth.od.ua/forum/viewtopic.php?f=6&t=2106) on the official stealth board, but I'm posting it here cause on their board the majority of user-base is russian.
Prerequisites
- Any PC able to run the Eclipse IDE (http://www.eclipse.org/) (this is the platform on the top of witch we'll run our debugger);
- The Python (http://www.python.org/) environment compatible with Stealth (for this tutorial I've used 2.7.x, but this has also been tested and proved to work with 3.2.x with some small changes). If you're reading this probably you know what I'm speaking of :D;
- Pydev (http://pydev.org/) extension for Eclipse (this is where the sweet part of debug takes place ;)). At the moment of writing I'm using 2.4 version.
Preparation Steps
Installing Eclipse
Download (http://www.eclipse.org/downloads/) a version of Eclipse that suits your PC and install it (for this tutorial I've used the Eclipse IDE for Java EE Developers).
Installing PyDev on top of Eclipse
- From Eclipse menu choose Help -> Install New Software...
(http://img577.imageshack.us/img577/6118/screenshotstudiocapturej.png) (http://img577.imageshack.us/i/screenshotstudiocapturej.png/)
View Screen Capture (http://img577.imageshack.us/i/screenshotstudiocapturej.png/)
- Click on the "Add" button to add a the PyDev site;
(http://img845.imageshack.us/img845/6771/screenshotstudiocapturel.png) (http://img845.imageshack.us/i/screenshotstudiocapturel.png/)
View Screen Capture (http://img845.imageshack.us/i/screenshotstudiocapturel.png/) - In the new prompt that appears type the name you like (I used "PyDev") and as site use the official site for PyDev releases: http://pydev.org/updates
(http://img17.imageshack.us/img17/4193/screenshotstudiocapturewp.png) (http://img17.imageshack.us/i/screenshotstudiocapturewp.png/)
View Screen Capture (http://img17.imageshack.us/i/screenshotstudiocapturewp.png/) - Now you are ready to install PyDev. You don't need Mylyn itegration (see the screen below).
(http://img715.imageshack.us/img715/3508/screenshotstudiocapturekw.png) (http://img715.imageshack.us/i/screenshotstudiocapturekw.png/)
View Screen Capture (http://img715.imageshack.us/i/screenshotstudiocapturekw.png/)
Configuring PyDev
Add the Python interpreter
- From the menu choose Window -> Preferences
(http://img585.imageshack.us/img585/9955/screenshotstudiocapturebe.png) (http://img585.imageshack.us/i/screenshotstudiocapturebe.png/)
View Screen Capture (http://img585.imageshack.us/i/screenshotstudiocapturebe.png/) - Expand the PyDev tree (step 1), choose "Interpreter Python" (step 2), click on the "New" Button (step 3) and point Eclipse to your python.exe path (on my machine as you can see is "D:\Python27\python.exe", the screen has been taken after configuring so you see the result of it).
(http://img210.imageshack.us/img210/8057/screenshotstudiocaptureyl.png) (http://img210.imageshack.us/i/screenshotstudiocaptureyl.png/)
View Screen Capture (http://img210.imageshack.us/i/screenshotstudiocaptureyl.png/)
Add the PyDev perspective to Eclipse
- On the top right corner click on the Open perspective button and select Other
(http://img706.imageshack.us/img706/6532/screenshotstudiocapturerv.jpg) (http://img706.imageshack.us/i/screenshotstudiocapturerv.jpg/)
View Screen Capture (http://img706.imageshack.us/i/screenshotstudiocapturerv.jpg/) - Select PyDev and confirm
(http://img822.imageshack.us/img822/7420/screenshotstudiocapturejk.jpg) (http://img822.imageshack.us/i/screenshotstudiocapturejk.jpg/)
View Screen Capture (http://img822.imageshack.us/i/screenshotstudiocapturejk.jpg/)
Add the remote debugger start and stop buttons
- Be sure to be in PyDev perspective and click on a empty spot on you toolbar and from the menu choose "Customize Perspective...";
(http://img201.imageshack.us/img201/1508/screenshotstudiocapturee.png) (http://img201.imageshack.us/i/screenshotstudiocapturee.png/)
View Screen Capture (http://img201.imageshack.us/i/screenshotstudiocapturee.png/) - In the "Commands Group Availability" tab put the check on the PyDev Debug option;
(http://img269.imageshack.us/img269/802/screenshotstudiocaptureu.png) (http://img269.imageshack.us/i/screenshotstudiocaptureu.png/)
View Screen Capture (http://img269.imageshack.us/i/screenshotstudiocaptureu.png/) - Now you should see the remote debugging buttons in you toolbar:
(http://img9.imageshack.us/img9/246/screenshotstudiocaptureyz.png) (http://img9.imageshack.us/i/screenshotstudiocaptureyz.png/)
View Screen Capture (http://img9.imageshack.us/i/screenshotstudiocaptureyz.png/) - Click on the green one and start the remote debugger (you can be sure that the debugger is started checking at the bottom of Eclipse interface in the Console log).
(http://img826.imageshack.us/img826/6893/screenshotstudiocapturesz.png) (http://img826.imageshack.us/i/screenshotstudiocapturesz.png/)
View Screen Capture (http://img826.imageshack.us/i/screenshotstudiocapturesz.png/)
Make Stealth interact with PyDev remote debugger
Now that everything is set up in PyDev we need to address Stealth to interact with it.
Referencing the pysrc module inside Stealth installation
- The first thing to make here is to find where the original pysrc module (bundled inside PyDev) has bee installed on our machine. The path changes depending on the installation. Typically it is in a sub folder of the Eclipse installation; in my machine it was ...\eclipse\plugins\org.python.pydev.debug_2.3.0.2011121518\pysrc on your machine should be something very similar.
- Once you've found it make a copy of the whole pysrc folder and place it wherever you like it. On my machine i putted it in the following path "D:\stealth\script\pydebug\pysrc" being "D:\stealth\" the path where my Stealth installation resides;
- Now go inside the newly created directory ("D:\stealth\script\pydebug\pysrc") and create a new empty file and name it "__init__.py".
Call the Remote Debugger from within you code
Now everything is ready and you only need to make your script aware of the remote debugger. To make this happen add this snippet in the header of your Python script (I'm going to comment it line by line later on) before launching it from Stealth (not PyDev!):
REMOTE_DBG = True
if REMOTE_DBG:
sys.path.append('D:\\stealth\\script\\pydebug')
sys.path.append('D:\\stealth\\script\\pydebug\\pysrc') #this is only needed if you run Python >= 3.2.x
print str(sys.path)
import pysrc.pydevd as pydevd
pydevd.settrace('localhost', stdoutToServer=True, stderrToServer=True)
REMOTE_DBG = True
Here you define a Boolean variable to be able to switch the debugger as you like (see the if condition soon after after)
sys.path.append('D:\\stealth\\script\\pydebug')
sys.path.append('D:\\stealth\\script\\pydebug\\pysrc') #this is only needed if you run Python >= 3.2.x
Those two lines are really important. They are the lines that tells to Python where to look for the pysrc module that we have created in the step before. As you can see (the first of the two lines) is the parent directory of the one where we copied the pysrc module "D:\stealth\script\pydebug\pysrc" and the slash characters are escaped. To be sure that the path has been correctly added we also issue a print statement (you can never be sure... :P). If you are using Python 3.2.x you also need to explicitly specify the pysrc folder; this is due to differences in the way that Python 3.x handle the imports.
import pysrc.pydevd as pydevd
Here you import the pydevd class from the pysrc module. If you have an error here you did not added the pysrc path correctly in the previous step.
pydevd.settrace('localhost', stdoutToServer=True, stderrToServer=True)
This line will try to connect Stealth to the remote debugger (be sure to have started it) so you can start debugging. If everything is set up correctly you'll be prompted for where to find the script to debug: point it to you current script folder, swith to the Debug Perspective and you are done. :)
Known Issues
PyDev, will only promt you one time asking where to look for debug source and then will save the location and use it for following debug sessions. This is good if you are debugging the same script, but if you want to debug another script you'll have to make the following steps:
- From the menu choose Window -> Preferences
(http://img585.imageshack.us/img585/9955/screenshotstudiocapturebe.png) (http://img585.imageshack.us/i/screenshotstudiocapturebe.png/)
View Screen Capture (http://img585.imageshack.us/i/screenshotstudiocapturebe.png/) - Expand the PyDev tree and choose Debug -> Source Locator; select the last reference you used and remove it.
(http://img692.imageshack.us/img692/1106/screenshotstudiocapturerx.jpg) (http://img692.imageshack.us/i/screenshotstudiocapturerx.jpg/)
View Screen Capture (http://img692.imageshack.us/i/screenshotstudiocapturerx.jpg/)
Credits and references
References
This guide has been inspired from the following pages:
- PyDev Install Guide (http://pydev.org/manual_101_install.html#PyDevInstall-Beforestartingtheinstall);
- XBMC guide (http://wiki.xbmc.org/index.php?title=HOW-TO:Debug_Python_Scripts_with_Eclipse) on how to remote debug Python scripts.
Credits
Thank to Alex (http://stealth.od.ua/forum/memberlist.php?mode=viewprofile&u=22) (from the Stealth comunity) that in this post (http://stealth.od.ua/forum/viewtopic.php?f=2&t=2101) gave me the initial tips on how to start.
Thanks to Crome969 (http://www.scriptuo.com/index.php?action=profile;u=396) that pointed out troubles with Python 3.2.x
-
Holy crap, Boydon. Great writeup!! Thanks for that. +rep for you.
-
Thank you Boydon,
you pushed that way really good. Tutorial is simple to understand i will use this for my python debug :)
-
Great job Boydon, it's a shame i'm more of a pascal guy )
-
Updated the guide to support Python 3.2.x. Thanks to Crome969 that spotted out trobles. :)
-
I dunno, this is pushing my closer and closer to giving this thing a whirl!
-
Just curious...
Failed: Python Interpreter not found. Install Python x86(2.7 or 3.3) from http://python.org/download/
And for what it's worth. I was never prompted what to add here:
(http://puu.sh/2Tklk.png)
-
Be sure to have a Python interpreter installed as specified in step:
Add the Python interpreter
Window -> Preferences
Expand the PyDev tree (step 1), choose "Interpreter Python" (step 2), click on the "New" Button (step 3) and point Eclipse to your python.exe path (on my machine as you can see is "D:\Python27\python.exe", the screen has been taken after configuring so you see the result of it).
-
Be sure to have a Python interpreter installed as specified in step:
Add the Python interpreter
Window -> Preferences
Expand the PyDev tree (step 1), choose "Interpreter Python" (step 2), click on the "New" Button (step 3) and point Eclipse to your python.exe path (on my machine as you can see is "D:\Python27\python.exe", the screen has been taken after configuring so you see the result of it).
All that was setup already, anyways I gave up on it a long time ago :>
-
: I`m following this tutorial but getting an error when run this
import sys
REMOTE_DBG = True
if REMOTE_DBG:
sys.path.append('D:\\Jogos\\Ultima Online\\Stealth\\Stealth_v8.7.2\\Scripts\\pydebug')
sys.path.append('D:\\Jogos\\Ultima Online\\Stealth\\Stealth_v8.7.2\\Scripts\\pydebug\\pysrc') #this is only needed if you run Python >= 3.2.x
print str(sys.path)
import pysrc.pydevd as pydevd
pydevd.settrace('localhost', stdoutToServer=True, stderrToServer=True)
AttributeError: 'module' object has no attribute 'declare_namespace'
09:26:14:450 [tfg noob]: ['D:\\Jogos\\Ultima Online\\Stealth\\Stealth_v8.7.2\\py_stealth', 'C:\\WINDOWS\\SYSTEM32\\python27.zip', 'C:\\Python27\\DLLs', 'C:\\Python27\\lib', 'C:\\Python27\\lib\\plat-win', 'C:\\Python27\\lib\\lib-tk', 'C:\\Python27', 'C:\\Python27\\lib\\site-packages', 'C:\\Python27\\lib\\site-packages\\win32', 'C:\\Python27\\lib\\site-packages\\win32\\lib', 'C:\\Python27\\lib\\site-packages\\Pythonwin', 'D:\\Jogos\\Ultima Online\\Stealth\\Stealth_v8.7.2', 'D:\\Jogos\\Ultima Online\\Stealth\\Stealth_v8.7.2\\Scripts\\workspace\\UO-001\\src\\core', 'D:\\Jogos\\Ultima Online\\Stealth\\Stealth_v8.7.2\\Scripts\\pydebug', 'D:\\Jogos\\Ultima Online\\Stealth\\Stealth_v8.7.2\\Scripts\\pydebug\\pysrc']
09:26:14:450 [tfg noob]:
09:26:14:749 [tfg noob]: Traceback (most recent call last):
09:26:14:749 [tfg noob]: File "D:\Jogos\Ultima Online\Stealth\Stealth_v8.7.2\Scripts\workspace\UO-001\src\core\auto2.py", line 8, in <module>
09:26:14:749 [tfg noob]: import pysrc.pydevd as pydevd
09:26:14:749 [tfg noob]: File "D:\Jogos\Ultima Online\Stealth\Stealth_v8.7.2\Scripts\pydebug\pysrc\pydevd.py", line 28, in <module>
09:26:14:749 [tfg noob]: from _pydevd_bundle import pydevd_vars
09:26:14:749 [tfg noob]: File "D:\Jogos\Ultima Online\Stealth\Stealth_v8.7.2\Scripts\pydebug\pysrc\_pydevd_bundle\pydevd_vars.py", line 8, in <module>
09:26:14:749 [tfg noob]: from _pydevd_bundle.pydevd_xml import ExceptionOnEvaluate, get_type, var_to_xml
09:26:14:749 [tfg noob]: File "D:\Jogos\Ultima Online\Stealth\Stealth_v8.7.2\Scripts\pydebug\pysrc\_pydevd_bundle\pydevd_xml.py", line 3, in <module>
09:26:14:749 [tfg noob]: from _pydevd_bundle import pydevd_extension_utils
09:26:14:750 [tfg noob]: File "D:\Jogos\Ultima Online\Stealth\Stealth_v8.7.2\Scripts\pydebug\pysrc\_pydevd_bundle\pydevd_extension_utils.py", line 4, in <module>
09:26:14:750 [tfg noob]: import pydevd_plugins.extensions
09:26:14:750 [tfg noob]: File "D:\Jogos\Ultima Online\Stealth\Stealth_v8.7.2\Scripts\pydebug\pysrc\pydevd_plugins\extensions\__init__.py", line 2, in <module>
09:26:14:750 [tfg noob]: __import__('pkg_resources').declare_namespace(__name__)
09:26:14:750 [tfg noob]: AttributeError: 'module' object has no attribute 'declare_namespace'
using pydev 6.2.0
eclipse 4.6
python 2.7.14