[IronPython] Porting from CPython: Figuring out the calling code's directory

Dino Viehland dinov at microsoft.com
Fri Nov 7 00:24:13 CET 2008

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: users-bounces at lists.ironpython.com [mailto:users-bounces at lists.ironpython.com] On Behalf Of Ori Peleg
Sent: Thursday, November 06, 2008 2:27 PM
To: users at lists.ironpython.com
Subject: [IronPython] Porting from CPython: Figuring out the calling code's directory


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


Check out my blog: http://orip.org
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/ironpython-users/attachments/20081106/66c14bf3/attachment.html>

More information about the Ironpython-users mailing list