From: doug <do...@o2...> - 2010-05-31 11:46:51
|
I've been trying to run code in the Python gramplet (to make use of my gramps database and environment), but I seem to have just got into a complete twist. I want to, say, run code in a gramplet. In the Python gramplet I write the entire code interactively to define a class and method and then make assignments to carry out some action. Fine; it works. I write the class and method definitions as a gramplet, the gramplet appears in the gramplet list; I click on it; the window appears but no action takes place. Close the gramplet. I call up the Python gramplet and try to import my gramplet preparatory to writing the assignments to cause an action to take place. But when I try to use the method(s) defined in the gramplet I get an error, e.g. <quote> >import OpenFF >x=OpenFF() Traceback (most recent call last): File "/home/fred/.gramps/gramps33/plugins/PythonGramplet/PythonGramplet.py", line 98, in process_command exec exp in self.env File "<string>", line 1, in <module> TypeError: 'module' object is not callable <endquote> Or trying to import defs from, say, NarrativeWeb, and then continue with interactive code: <quote> >import gen.db >z=dbstate.db.get_object_from_gramps_id("O0343") >import NarrativeWeb >q=NarrativeWeb >j=q.media_ref_rect_regions(z) Traceback (most recent call last): File "/home/fred/.gramps/gramps33/plugins/PythonGramplet/PythonGramplet.py", line 98, in process_command exec exp in self.env File "<string>", line 1, in <module> AttributeError: 'module' object has no attribute 'media_ref_rect_regions' <endquote> What am I doing so radically wrong? How does one run/debug code in the gramps environment? |
From: Doug B. <dou...@gm...> - 2010-05-31 13:15:41
|
Some hints below. On Mon, May 31, 2010 at 7:44 AM, doug <do...@o2...> wrote: > I've been trying to run code in the Python gramplet (to make use of my > gramps database and environment), but I seem to have just got into a > complete twist. > > I want to, say, run code in a gramplet. In the Python gramplet I write > the entire code interactively to define a class and method and then make > assignments to carry out some action. Fine; it works. > > I write the class and method definitions as a gramplet, the gramplet > appears in the gramplet list; I click on it; the window appears but no > action takes place. This is what would happen if you have an error in your code. There is probably a message in the console. > Close the gramplet. > I call up the Python gramplet and try to import my gramplet preparatory > to writing the assignments to cause an action to take place. But when I > try to use the method(s) defined in the gramplet I get an error, e.g. > > <quote> > >import OpenFF > >x=OpenFF() > > Traceback (most recent call last): > File > "/home/fred/.gramps/gramps33/plugins/PythonGramplet/PythonGramplet.py", > line 98, in process_command > exec exp in self.env > File "<string>", line 1, in <module> > TypeError: 'module' object is not callable > <endquote> I'm surprised that you can import your code at all. In trunk, addons don't appear in the PYTHONPATH. You must be working on your code in a directory that Gramps searches. You can add an addon path using something like: >>> import sys >>> sys.path.append("/home/fred/.gramps/gramps33/plugins/MyAddon") But to your error, which is stated at the bottom of the Python error: 'module' object is not callable. If you have a function or class in the file OpenFF.py, then you need to do this: >>> import OpenFF >>> x = OpenFF.Open() or this: >>> from OpenFF import * >>> x = Open() This is just Python, so any book or webpage can help with these kinds of issues. The Python Gramplet was written to act as a standard Python interpreter (such as ipython, python -i, or idle). > Or trying to import defs from, say, NarrativeWeb, and then continue with > interactive code: > <quote> > >import gen.db > >z=dbstate.db.get_object_from_gramps_id("O0343") > >import NarrativeWeb > >q=NarrativeWeb > >j=q.media_ref_rect_regions(z) > Traceback (most recent call last): > File > "/home/fred/.gramps/gramps33/plugins/PythonGramplet/PythonGramplet.py", > line 98, in process_command > exec exp in self.env > File "<string>", line 1, in <module> > AttributeError: 'module' object has no attribute 'media_ref_rect_regions' > <endquote> Again, you are getting confused between the module NarrativeWeb and the classes in them. In addition, you can't just call a "method" from a "class" without an "instance". If those words don't mean anything to you then this will be hard. But, I don't think I would debug a plugin this way. You can load a module and code in it, but a plugin has many requirements to run. You could use the Python debugger (pdb). This is what I do: 1) insert the line: "import pdb; pdb.set_trace()" into your Python code 2) run gramps (not in the background): "python src/gramps.py" 3) interactively step through the code. > What am I doing so radically wrong? How does one run/debug code in the > gramps environment? We could also display the error message in the console. Rather than "the gramplet did not load". That would go a long way toward giving you what you need. I'll look at that... -Doug > > > ------------------------------------------------------------------------------ > > _______________________________________________ > Gramps-devel mailing list > Gra...@li... > https://lists.sourceforge.net/lists/listinfo/gramps-devel > |
From: doug <do...@o2...> - 2010-06-01 14:36:00
|
Doug, many thanks. On 31/05/10 14:15, Doug Blank wrote: > Some hints below. > <snip> >> I write the class and method definitions as a gramplet, the gramplet >> appears in the gramplet list; I click on it; the window appears but no >> action takes place. > > This is what would happen if you have an error in your code. There is > probably a message in the console. Part of my problem has been that there are usually no error messages. Nor does using the debug option produce anything. >> Close the gramplet. >> I call up the Python gramplet and try to import my gramplet preparatory >> to writing the assignments to cause an action to take place. But when I >> try to use the method(s) defined in the gramplet I get an error, e.g. >> >> <quote> >> >import OpenFF >> >x=OpenFF() >> >> Traceback (most recent call last): >> File >> "/home/fred/.gramps/gramps33/plugins/PythonGramplet/PythonGramplet.py", >> line 98, in process_command >> exec exp in self.env >> File "<string>", line 1, in<module> >> TypeError: 'module' object is not callable >> <endquote> > > I'm surprised that you can import your code at all. In trunk, addons > don't appear in the PYTHONPATH. You must be working on your code in a > directory that Gramps searches. Yes. You can add an addon path using > something like: > >>>> import sys >>>> sys.path.append("/home/fred/.gramps/gramps33/plugins/MyAddon") > That's very helpful > But to your error, which is stated at the bottom of the Python error: > 'module' object is not callable. If you have a function or class in > the file OpenFF.py, then you need to do this: > >>>> import OpenFF >>>> x = OpenFF.Open() Aah! > or this: > >>>> from OpenFF import * >>>> x = Open() > > This is just Python, so any book or webpage can help with these kinds > of issues. The Python Gramplet was written to act as a standard Python > interpreter (such as ipython, python -i, or idle). I've been trying to work from the Python Tutorial >> Or trying to import defs from, say, NarrativeWeb, and then continue with >> interactive code: >> <quote> >> >import gen.db >> >z=dbstate.db.get_object_from_gramps_id("O0343") >> >import NarrativeWeb >> >q=NarrativeWeb >> >j=q.media_ref_rect_regions(z) >> Traceback (most recent call last): >> File >> "/home/fred/.gramps/gramps33/plugins/PythonGramplet/PythonGramplet.py", >> line 98, in process_command >> exec exp in self.env >> File "<string>", line 1, in<module> >> AttributeError: 'module' object has no attribute 'media_ref_rect_regions' >> <endquote> > > Again, you are getting confused between the module NarrativeWeb and > the classes in them. In addition, you can't just call a "method" from > a "class" without an "instance". If those words don't mean anything to > you then this will be hard. I think I had the concepts to begin with, but being unable to create the instances in the Python gramplet got me confused. > > But, I don't think I would debug a plugin this way. You can load a > module and code in it, but a plugin has many requirements to run. You > could use the Python debugger (pdb). This is what I do: > > 1) insert the line: "import pdb; pdb.set_trace()" into your Python code > 2) run gramps (not in the background): "python src/gramps.py" > 3) interactively step through the code. Many thanks; that's just what I was looking for! > >> What am I doing so radically wrong? How does one run/debug code in the >> gramps environment? > > We could also display the error message in the console. Rather than > "the gramplet did not load". That would go a long way toward giving > you what you need. I'll look at that... That really would be a great help, especially for someone floundering like me. Cheers, Doug |
From: doug <do...@o2...> - 2010-06-01 16:58:55
|
On 01/06/10 15:33, doug wrote: > Doug, many thanks. > > > On 31/05/10 14:15, Doug Blank wrote: >> Some hints below. >> ><snip> I'm afraid I need more hand-holding. I illustrate the problem below. .........................................................Straight Python [fred@Z600 ~]$ python Python 2.6.1 (r261:67515, Jan 8 2010, 16:20:25) [GCC 4.3.2] on linux2 >>> import os >>> import webbrowser >>> class OpenFF: ... def f(self,fname): ... webbrowser.open_new(fname) ... >>> x=OpenFF() >>> x.f('file:///home/fred/Clara-IMG_1377.jpg') ---------------displays image in Firefox >>> x.f('file:///home/fred/tryregions.gpkg.media/Malkah_Leiter.jpg') ............... ditto .................................................As a Gramplet file OpenFF.py # -*- coding: utf-8 -*- # File OpenFF.py import os import webbrowser import pdb pdb.set_trace() class OpenFF(Gramplet): def f(self, fname): webbrowser.open_new(fname) file OpenFF.gpr.py # -*- coding: utf-8 -*- # File: OpenFF.gpr.py register(GRAMPLET, id="OpenFF Gramplet", name=_("OpenFF Gramplet"), description = _("a program that shows an image"), version="0.0.1", gramps_target_version="3.3", status = STABLE, fname="OpenFF.py", height = 200, gramplet = 'OpenFF', gramplet_title=_("Sample Gramplet") ) I start gramps; OpenFF appears in the Gramplet list. then click on OpenFF > /home/fred/.gramps-trunk/trunk/src/plugins/gramplet/OpenFF.py(7)<module>() -> class OpenFF(Gramplet): (Pdb) def f(self,fname): *** SyntaxError: unexpected EOF while parsing (<stdin>, line 1) (Pdb) What's up? Doug |
From: Doug B. <dou...@gm...> - 2010-06-01 17:13:45
|
On Tue, Jun 1, 2010 at 12:56 PM, doug <do...@o2...> wrote: > On 01/06/10 15:33, doug wrote: >> Doug, many thanks. >> >> >> On 31/05/10 14:15, Doug Blank wrote: >>> Some hints below. >>> >><snip> > > I'm afraid I need more hand-holding. I illustrate the > problem below. > > .........................................................Straight > Python > [fred@Z600 ~]$ python > Python 2.6.1 (r261:67515, Jan 8 2010, 16:20:25) > [GCC 4.3.2] on linux2 > >>> import os > >>> import webbrowser > >>> class OpenFF: > ... def f(self,fname): > ... webbrowser.open_new(fname) > ... > >>> x=OpenFF() > >>> x.f('file:///home/fred/Clara-IMG_1377.jpg') > ---------------displays image in Firefox > >>> > x.f('file:///home/fred/tryregions.gpkg.media/Malkah_Leiter.jpg') > ............... ditto > > .................................................As a Gramplet > file OpenFF.py > > # -*- coding: utf-8 -*- > # File OpenFF.py > import os > import webbrowser > import pdb > pdb.set_trace() > class OpenFF(Gramplet): > def f(self, fname): > webbrowser.open_new(fname) > > file OpenFF.gpr.py > > # -*- coding: utf-8 -*- > # File: OpenFF.gpr.py > register(GRAMPLET, > id="OpenFF Gramplet", > name=_("OpenFF Gramplet"), > description = _("a program that shows an image"), > version="0.0.1", > gramps_target_version="3.3", > status = STABLE, > fname="OpenFF.py", > height = 200, > gramplet = 'OpenFF', > gramplet_title=_("Sample Gramplet") > ) > > > I start gramps; OpenFF appears in the Gramplet list. > > then click on OpenFF > > > > /home/fred/.gramps-trunk/trunk/src/plugins/gramplet/OpenFF.py(7)<module>() > -> class OpenFF(Gramplet): > (Pdb) def f(self,fname): > *** SyntaxError: unexpected EOF while parsing (<stdin>, line 1) > (Pdb) > > What's up? You'll need to read up on how to use the Python Debugger: http://docs.python.org/library/pdb.html -Doug > Doug > > > ------------------------------------------------------------------------------ > > _______________________________________________ > Gramps-devel mailing list > Gra...@li... > https://lists.sourceforge.net/lists/listinfo/gramps-devel > |
From: doug <do...@o2...> - 2010-06-02 10:16:56
|
On 01/06/10 18:13, Doug Blank wrote: <snip> >> >> What's up? > > You'll need to read up on how to use the Python Debugger: > > http://docs.python.org/library/pdb.html > > -Doug > >> Doug OK, thanks Doug |