The short answer is no – we realize frames is a common request and I do have a 
prototype implementation of them.  We’re still working on our 2.1 planning  but 
it might be available there w/ a command line option or it might be something 
we could port to 2.0.1.

The longer answer would be potentially with a lot of work and it could be quite 
slow.  You could walk every module, every function, every class and attempt to 
gather up all the function objects in the world.  Then you could call 
PythonOps.FunctionGetTarget on each one of them.  Finally you could do a full 
.NET stack trace (new System.Diagnostics.StackTrace()) and attempt to figure 
your caller by filtering out any IronPython/DLR frames.  Finally once you have 
that method you could see if that method is == the .Method property of any of 
the delegates you got from FunctionGetTarget calls.  And I’m not even 100% sure 
if that’d work – the delegates for a PythonFunction might have a different 
MethodInfo then the one in the stack trace but I’m not certain (if this is the 
case it’d be due to the way CLR hides DynamicMethod MethodInfo’s so only the 
creator has access to them – you might be able to use some hack like a name 
comparison heuristic or private reflection or something to bring it all 
together).

From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf Of Ori Peleg
Sent: Thursday, November 06, 2008 2:27 PM
To: users@lists.ironpython.com
Subject: [IronPython] Porting from CPython: Figuring out the calling code's 
directory

Hi,

I'm porting Testoob to IronPython and have a module function that needs to know 
the filename where the code calling it is defined.

In CPython I get the current frame with sys._getframe(), then climb
the stack with frame.f_back until I find a different file:

def _first_external_frame():
   import sys

   # find the first frame with a filename different than this one
   frame = sys._getframe()
   while frame.f_globals["__file__"] == __file__:
       frame = frame.f_back

   return frame

def _calling_module_directory():
   from os.path import dirname, normpath
   return normpath(dirname(_first_external_frame().f_globals["__file__"]))

I know I can't climb the stack in IronPython, but is there another way
to do it? Maybe some available .NET assembly metadata?

BTW - the use case is for building test suites: you can have a
subpackage of tests and define __init__.py like this:

def suite():
   import testoob
   return testoob.collecting.collect_from_files("test_*.py")

Thanks,
orip.

--
Check out my blog: http://orip.org
_______________________________________________
Users mailing list
Users@lists.ironpython.com
http://lists.ironpython.com/listinfo.cgi/users-ironpython.com

Reply via email to