[Python] global variable issue on linux

131 views
Skip to first unread message

Xavier Lapointe

unread,
May 11, 2012, 9:11:30 PM5/11/12
to soft...@listproc.autodesk.com
Hey guys,

This one really surprised me. I tend to avoid global variable in Softimage plugins as much as I can, but sometimes it might be convenient.

So basically, I wanted to use a global variable ( simple Python Dictionary ) to keep some stuff in reference while interacting with a PPG. I remember clearly that it was working well under Windows, so 
I assume this is a python 2.5 Linux issue (if this is an issue - please tell me if this is normal under Soft with python 2.5).

Here's basically what I was trying to do:

[imports ....]

# Global Scope 
LAST_SELECTION = {
    'project': {},
    'category': '',
    'entities': [],
}

def CustomCommand_Execute():
    global LAST_SELECTION
    [Do some modifications to LAST_SELECTION]
 

Following this pattern:
  • Prompt the PPG
  • Interact with the UI
  • The custom command is fired - do some modifications to LAST_SELECTION
  • hit another PPG UI
  • Hell the LAST_SELECTION global is back to the inital value!
I've been tracing the LAST_SELECTION variable with id(), and it's changing every time I interact with the UI; showing clearly that there is something nasty going on under the hood (?)

Any idea to get this working?

Alan mentioned the Application.SetGlobal/Application.GetGlobal functions ... but still, this should be working natively, isn't?

Thanks!

--
Xavier

Xavier Lapointe

unread,
May 11, 2012, 9:13:35 PM5/11/12
to soft...@listproc.autodesk.com

hit another PPG UI Item *** 

... All happening under the same Property page.

2012/5/11 Xavier Lapointe <xl.mail...@gmail.com>



--
Xavier

Matt Lind

unread,
May 11, 2012, 9:18:28 PM5/11/12
to soft...@listproc.autodesk.com

My experience with global variables in scripting is softimage treats them like static declared variables from C/C++.   The variable is initialized once, then cached for all future invocations of the script during the user  session.  They are not de-referenced when the script terminates/completes.

 

This mainly applies to scripts run from the script editor directly.  Global variables inside of self installing plugins should work as expected.

 

 

Matt

Alok Gandhi

unread,
May 11, 2012, 9:20:09 PM5/11/12
to soft...@listproc.autodesk.com
I am not sure whether this works under windows as well, the plugin script can get refreshed and all your global variables will be re-initialized. The only good approaches that I have been using is to store the varaibles in UIITems lists. This works well for the 3D com objects as well. Another idea would be to pass on objects returning through a safe array from the commands itself.
--

Xavier Lapointe

unread,
May 11, 2012, 9:24:13 PM5/11/12
to soft...@listproc.autodesk.com
Hm, yes I could store it in a parameter or another way ... just this feels hacky to get something basic done (granted no refresh happend during the plugin execution).

This should work, like Matt mentioned :/

Oh well.




2012/5/11 Alok Gandhi <alok.ga...@gmail.com>



--
Xavier

Alok Gandhi

unread,
May 11, 2012, 9:33:32 PM5/11/12
to soft...@listproc.autodesk.com
Yes if PPG is not getting refreshed then this seems weird. The only thing that comes to mind is maybe the custom command execution is making things go wrong. What if you use a function declared inside the plugin instead of calling the custom command ? or maybe the custom command should be implemented in the same plugin as the PPG, this does not make sense but is worth a try.
--

Xavier Lapointe

unread,
May 11, 2012, 9:37:15 PM5/11/12
to soft...@listproc.autodesk.com
I'll add some context:
  • everything lives in the same plugin
  • I tried storing it in a container coming from an imported module
  • tried accessing and setting the global variable directly in the globals() dictionary
  • Grumble Gumble.



2012/5/11 Alok Gandhi <alok.ga...@gmail.com>



--
Xavier

Alok Gandhi

unread,
May 11, 2012, 9:45:49 PM5/11/12
to soft...@listproc.autodesk.com
One last thing, I checked one plugin where this works, of course in windows, but in my code I do not use 'global ' keyword when accesing the global dict. Something like this:
globalDict = {}

def _setGlobalDict(inObj=None, meshData=None):
    if inObj:
        globalDict['obj'] = inObj # no use of 'global' here.
   
    if meshData:
        globalDict['data'] = meshData
   
    return True

and then I call _setGlobalDict() wherever I need to.
--

Xavier Lapointe

unread,
May 11, 2012, 10:15:57 PM5/11/12
to soft...@listproc.autodesk.com
Tried your solution but could not get it to work :(


Found a way, but I would need to understand the internal mechanism to reproduce it more cleanly.

from win32com.client import constants
constants.__dicts__.append({'PLUGIN_GLOBAL_SCOPE': None,'project': {},'category': '','entities': []})
container = [d for d in constants.__dicts__ if 'PLUGIN_GLOBAL_SCOPE' in d][0]


Far from being ideal ...


2012/5/11 Alok Gandhi <alok.ga...@gmail.com>



--
Xavier

Alan Fregtman

unread,
May 12, 2012, 12:48:26 AM5/12/12
to soft...@listproc.autodesk.com
Makes one wonder if that's why Application.SetGlobal() exists. =p lol

Aloys Baillet

unread,
May 19, 2012, 2:23:22 AM5/19/12
to soft...@listproc.autodesk.com
Sorry a bit late in the thread, but global variables don't work in Python plugins, as XSI fairly often re-executes the plugin code, especially when dealing with PPG.
Not sure why it's doing this, but the consequence is that you just can't rely on those as you would in a regular module, and that's a good reason to prefer coding python in modules than in plugins.
I think there is a way to make global work though, if you do something like this:

if 'MYGLOBAL' not in globals():
    global MYGLOBAL
    MYGLOBAL = 'MY_GLOBAL_DEFAULT_VALUE'

Cheers,

Aloys
--
Aloys Baillet
Lead Software Developer
Research & Development - Animal Logic
--

Reply all
Reply to author
Forward
0 new messages