3

I'm having the hardest time trying to import a few things. I have an addon that has multiple files all under one folder with an __init__.py in the base. I'm performing all of these imports from this __init__.py. The addon folder resides in my addon folder as scripts/addons/RLD_Toolkit

My directory hierarchy looks like this Directory Hierarchy

The part of the script where it errors

def register():
    #These imports do not work
    from . import rld_panel
    import rld_panel

    #This import does work
    import RLD_Toolkit.rld_panel

The error I'm getting is

Import Error: cannot import name `rld_panel`

Why won't it perform the relative imports (or even the straight up import) from my __init__.py?

Edit: Here's a printout of my globals() variables and sys.path globals and path

Cobertos
  • 379
  • 4
  • 14
  • My guess: Blender screws up the pythonpath. Print it and see if it makes sense. – Mörkö Sep 05 '15 at 06:08
  • @user277143 Updated post with printout of globals and sys.path – Cobertos Sep 05 '15 at 06:13
  • As you can see, the folder you are in isn't in the import path. As addons is in the python path, saying import RLD_Toolkit.rld_panel imports from the module (that is the whole folder with your init.py) the file rld_panel.py. I would advise you to add the current folder into the path. – Mörkö Sep 05 '15 at 06:15
  • I'm confused? You're talking about __path__ right? That's the folder with all my stuff in it. – Cobertos Sep 05 '15 at 06:16
  • Nope. path is the path of the file. When you try to import things, python looks in sys.path, which doesn't contain the folder. – Mörkö Sep 05 '15 at 06:18
  • 1
    Have a look at this answer, especially #2: http://blender.stackexchange.com/questions/33603/importing-python-modules-and-text-files – TLousky Sep 05 '15 at 07:22

1 Answers1

1

To answer the question, you will have to add the line:

sys.path.append(__path__)

before importing anything. This will add the current folder into the path Python looks in for imports. Then you can import files with:

import foo

instead of:

from bar import foo

.

Mörkö
  • 1,296
  • 8
  • 15
  • 1
    This fixes it. Can you provide any insight as to why this won't work for me yet I have two other addons that perform normal relative imports and it works? Python + Blender is kind of a mystery to me sometimes so some speculation on the inner workings would be helpful to know. – Cobertos Sep 05 '15 at 06:26
  • 2
    No living being can hope to understand what happens inside Blender. Turn around, mortal. Your quest is hopeless. – Mörkö Sep 05 '15 at 06:28
  • I need to publish an update to this with code samples, through browsing the Blender Python bindings and trial and error, I've kind of come up with a home brew relative import system that even supports reloading (as long as your code is written in a specific way that doesn't reuse globals and unregisters everything properly). – Cobertos Dec 15 '17 at 18:21
  • This doesn't work with currently Blender / Python. It doesn't recognize __path__ anymore. – max pleaner Sep 28 '21 at 00:19