I am dealing with an application which reads in configurations by
calling (a wrapper around) execfile. Any configuration file may itself
execfile other configuration files in the same manner.
I would like to create a log containing all global assignments made in
these files. Comparing the globals dictionaries before and after is
not quite enough, as
a) this misses multiple assignments to the same name, within a single
file,
b) doesn't allow me to pinpoint the line at which the assignment is
made.
Inspecting the implementation of execfile suggests to me that the
assignments are performed by a hard-wired call to PyDict_SetItem, in
the opcode implementations, so it looks like ideas based on giving
execfile a globals dictionary with an instrumented __setitem__ are
probably doomed to failure.
Is there any way of injecting some of my code into the process of
global name binding, or some other means of "capturing" global
assignments ? 4 1419
Jacek Generowicz wrote: I am dealing with an application which reads in configurations by calling (a wrapper around) execfile. Any configuration file may itself execfile other configuration files in the same manner.
I would like to create a log containing all global assignments made in these files. Comparing the globals dictionaries before and after is not quite enough, as
a) this misses multiple assignments to the same name, within a single file,
b) doesn't allow me to pinpoint the line at which the assignment is made.
Inspecting the implementation of execfile suggests to me that the assignments are performed by a hard-wired call to PyDict_SetItem, in the opcode implementations, so it looks like ideas based on giving execfile a globals dictionary with an instrumented __setitem__ are probably doomed to failure.
Is there any way of injecting some of my code into the process of global name binding, or some other means of "capturing" global assignments ?
Suggestion:
Use ConfigParser to set your globals instead and you can track
your assignments over each file, section and option in the file.
Larry Bates
Larry Bates <lb****@syscononline.com> writes: Suggestion: Use ConfigParser to set your globals instead and you can track your assignments over each file, section and option in the file.
I would dearly love to go down this sort of route but, unfortunately,
they are not _my_ configuration files, and it is not _my_
configuration mechanism ... it's just the one I have to work with. I
do not have the freedom to change it; I merely have to try to make
some sense out of it :-(
Jacek Generowicz wrote: Inspecting the implementation of execfile suggests to me that the assignments are performed by a hard-wired call to PyDict_SetItem, in the opcode implementations, so it looks like ideas based on giving execfile a globals dictionary with an instrumented __setitem__ are probably doomed to failure.
For Python 2.4 here is evidence against that assumption:
$ cat config.py
a = 42
b = "so what" class Dict(dict):
.... def __setitem__(self, k, v):
.... print k, "->", v
.... dict.__setitem__(self, k, v)
.... execfile("config.py", Dict())
a -> 42
b -> so what
We are all doomed to succeed, then...
Peter
In 2.4 at least, it looks like execfile can take an arbirary mapping
object for globals, so something like this may work:
class LoggedDict(dict):
def __setitem__(self, item, val):
dict.__setitem__(self, item, val)
# Do whatever logging is needed here
print "Assignment made: %s = %r" % (item, val)
# When loading your config file use:
logged_globals = LoggedDict()
execfile(my_config_file, logged_globals)
Note that this covers all name binding (ie. function and class
definitions etc), not just assignments.
This might not work with earlier versions of python, since I think
these may restrict the globals argument to a real dictionary. This thread has been closed and replies have been disabled. Please start a new discussion. Similar topics
by: Steve Erickson |
last post by:
I have a logger class that uses the Python logging module. When I
call it within a program using the unittest module, I get one line in
the log file for the first test, two identical ones for the...
|
by: jjesso |
last post by:
I am trying to add a new logging level.
logging.config.fileConfig("bengineLog.cfg")
logging.CLIENT = logging.INFO + 1
logging.addLevelName( logging.CLIENT, 'CLIENT' )
logging.root.setLevel( )...
|
by: Spur |
last post by:
Hi all,
I implemented a memory allocation/deallocation class that logs all
new/delete calls (overloaded) and remembers for each allocated
block where it was allocated from (using a macro that...
|
by: Aniruddha |
last post by:
I want to initialize an array of function pointers (global)
If I do it like:
/* definition of foo_1, foo_2, foo_3 all return void and take no args */
void (* foo) ();
foo = foo_1 ;
foo = foo_2...
|
by: Einar Høst |
last post by:
Hi,
I'm getting into the Trace-functionality in .NET, using it to provide some
much-needed logging across dlls in the project we're working on. However,
being a newbie, I'm wondering if some...
|
by: Chris Smith |
last post by:
Hola, pythonisas:
The documentation for the logging module is good, but a bit obscure.
In particular, there seems to be a lot of action at a distance.
The fact that getLogger() can actually be a...
|
by: Dilip |
last post by:
I have a tiny design question to ask.
I am stuck with a home-brewed logging library that has different
methods for logging messages based on severity (like warning, error,
information etc.). ...
|
by: User1014 |
last post by:
A global variable is really just a property of the "Global Object", so
what does that make a function defined in the global context? A method
of the Global Object?
...
|
by: seb |
last post by:
Hi, I am writing to a file some basic information using the logging
module. It is working but in the log file some line are printed
several time. I had put some print debugging messages in the...
|
by: nemocccc |
last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
|
by: Sonnysonu |
last post by:
This is the data of csv file
1 2 3
1 2 3
1 2 3
1 2 3
2 3
2 3
3
the lengths should be different i have to store the data by column-wise with in the specific length.
suppose the i have to...
|
by: marktang |
last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
|
by: Oralloy |
last post by:
Hello folks,
I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>".
The problem is that using the GNU compilers,...
|
by: jinu1996 |
last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...
|
by: Hystou |
last post by:
Overview:
Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows...
|
by: tracyyun |
last post by:
Dear forum friends,
With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each...
|
by: agi2029 |
last post by:
Let's talk about the concept of autonomous AI software engineers and no-code agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing,...
|
by: isladogs |
last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM).
In this session, we are pleased to welcome a new...
| |