p3dFilename[SOLVED, NVM, My stupid]

I’m trying to build a p3d (and maybe later an exe/binary/installer) that can read a configuration file from the same place where that p3d file is located.

My code looks like this:

from panda3d.core import loadPrcFileData
from direct.showbase.AppRunnerGlobal import appRunner
if appRunner: 
    path=appRunner.p3dFilename.getDirname+'/config.cfg'    
else:  #for testing  
    path='config.cfg'
try:    
    f = open(path, 'r')
    for line in f:
        if not line.startswith('#'):        
            loadPrcFileData('',line)
except IOError:
    print "No config file!"            

But this won’t work. My p3dsession.log says:

:AppRunner: Total Panda3D disk space used: 162 MB
:AppRunner: Configured max usage is: 2048 MB
Traceback (most recent call last):
  File "C:\buildslave\release_rtdist_win32\build\panda3d\built_cmu\direct\showbase\Messenger.py", line 424, in __taskChainDispatch
  File "C:\buildslave\release_rtdist_win32\build\panda3d\built_cmu\direct\showbase\Messenger.py", line 482, in __dispatch
  File "C:\buildslave\release_rtdist_win32\build\panda3d\built_cmu\direct\p3d\AppRunner.py", line 748, in __startIfReady
  File "VFSImporter", line 153, in load_module
  File "D:\cave_demo\main.py", line 6, in <module>
    path=appRunner.p3dFilename.getDirname+'/config.cfg'    
TypeError: unsupported operand type(s) for +: 'builtin_function_or_method' and 'str'
:task(error): Exception occurred in PythonTask Messenger-default
Traceback (most recent call last):
  File "C:\buildslave\release_rtdist_win32\build\panda3d\built_cmu\direct\p3d\AppRunner.py", line 638, in run
  File "C:\buildslave\release_rtdist_win32\build\panda3d\built_cmu\direct\task\Task.py", line 502, in run
  File "C:\buildslave\release_rtdist_win32\build\panda3d\built_cmu\direct\task\Task.py", line 460, in step
  File "C:\buildslave\release_rtdist_win32\build\panda3d\built_cmu\direct\showbase\Messenger.py", line 424, in __taskChainDispatch
  File "C:\buildslave\release_rtdist_win32\build\panda3d\built_cmu\direct\showbase\Messenger.py", line 482, in __dispatch
  File "C:\buildslave\release_rtdist_win32\build\panda3d\built_cmu\direct\p3d\AppRunner.py", line 748, in __startIfReady
  File "VFSImporter", line 153, in load_module
  File "D:\cave_demo\main.py", line 6, in <module>
    path=appRunner.p3dFilename.getDirname+'/config.cfg'    
TypeError: unsupported operand type(s) for +: 'builtin_function_or_method' and 'str'
Failure on startup.

I’m kind of puzzled by that. getDirname() should return ‘str’ and not ‘builtin_function_or_method’, no?

Any ideas what’s the proper way to do it?

If I’m reading that correctly, you seem to have left out the brackets after “getDirname”, meaning that you’re asking to concatenate the function, rather than its result, to the string.

D’oh!

That suddenly makes sense. Thanks!