Open Explorer

Hello, I’m trying to open explorer that on blender’s project file location.
However, I can’t find way to open explorer. Anything way to do that?
Or if it can’t support Linux etc., can it open windows10?
Thank you.

import bpy
import os

filepath = bpy.data.filepath
directory = os.path.dirname(filepath)
print(directory)

I think this might be what you are looking for:

from os import listdir
dir = 'C:/A000/'
filenames = listdir(dir)
filenames.sort()
print(filenames)

I got that from some artificial intelligence coding rather than from Blender coding, so I tested it out
in Blender and it works fine.

1 Like

In Linux or Mac there are some equivalent file browser programs, with a simple ‘if-then-else’ can support many of them if needed. But now only for windows do this.

import bpy
import subprocess
import os

if bpy.data.filepath != '':
    dirpath = os.path.dirname(bpy.data.filepath)
    #subprocess.call('explorer '+dirpath, shell=True)
    os.startfile(dirpath)

PS. Code updated to FrankFirsching’s suggestion.

2 Likes

Haven’t tested it with directories, but this may work platform independently:

import os
os.startfile(path) 
2 Likes

Thank you for the many help!
I got after all It seems that Win and Mac have different structures.
The code can open windows explorer! :slight_smile:
I try on Mac too, But unfortunately It couldn’t open file browser… Xl
But thank you!!

1 Like

Sorry for adding, I’ll try to registration this function for keymap.
But when adding keymap function, It could not recognize…
Anything tips to do that?
Thank you.


bl_info = {
  "name": "TestAddOn",
  "description": "This AddOn is test AddOn",
  "author": "",
  "version": (1, 0, 0, 0),
  "blender": (2, 80, 0),
  "support": "TESTING",
  "category": "Test",
  "location": "",
  "warning": "",
  "wiki_url": "",
  "tracker_url": ""
}

import bpy
import subprocess
import os

class TESTADDON(bpy.types.Operator):
  bl_idname = "test.addon"
  bl_label = "TestAddOn"

  def execute(self, context):

            if bpy.data.filepath != '':
                dirpath = os.path.dirname(bpy.data.filepath)
                os.startfile(dirpath)
                print("Addon Running")

            return {'FINISHED'}


def register():
  print("regist addon")
  bpy.utils.register_class(TESTADDON)
    wm = bpy.context.window_manager
    km = wm.keyconfigs.addon.keymaps.new(name='VIEW_3D', space_type='EMPTY')
    kmi = km.keymap_items.new(TESTADDON.bl_idname, 'SPACE', 'PRESS', ctrl=True, shift=True)
    addon_keymaps.append(km)

def unregister():
  print("unregist addon")
  bpy.utils.unregister_class(TESTADDON)
    wm = bpy.context.window_manager
    for km in addon_keymaps:
    wm.keyconfigs.addon.keymaps.remove(km)
    del addon_keymaps[:]

if __name__ == "__main__":
  register()

bl_info = {
    "name": "OpenPath",
    "description": "This AddOn is test AddOn",
    "author": "",
    "version": (1, 0, 0, 0),
    "blender": (2, 90, 0),
    "support": "TESTING",
    "category": "Test",
}

import bpy
import subprocess
import os

class OpenPath(bpy.types.Operator):
    bl_idname = "test.open_path"
    bl_label = "Open Path"
    whichpath : bpy.props.StringProperty()

    wellknownpaths = {
        '@thisblenderfile': lambda: bpy.data.filepath
    }

    def execute(self, context):
        if self.whichpath == '':
            self.report({'WARNING'}, 'No path defined')
            return {'FINISHED'}

        # trying special path notation
        if self.whichpath in self.wellknownpaths:
            path = self.wellknownpaths[self.whichpath]()
            self.whichpath = path

        # validate path
        if not os.path.exists(self.whichpath):
            self.report({'WARNING'}, 'No path defined')
            print(f'path {self.whichpath} does not exist')
            return {'FINISHED'}

        os.startfile(os.path.dirname(self.whichpath))

        return {'FINISHED'}
        
    def draw(self, context):
        layout = self.layout
        layout.lable(text='hello')
        # layout.operator(OpenPath.bl_idname, text=OpenPath.bl_label).action = 'TOGGLE'

class OpenPathMenu(bpy.types.Menu):
    bl_label = "Open Path"
    bl_idname = "VIEW3D_MT_openpath_menu"

    def draw(self, context):
        layout = self.layout

        layout.operator(OpenPath.bl_idname, text="This Blender File", icon="SELECT_SUBTRACT").whichpath = '@thisblenderfile'

class AddonKeymaps:
    keymaps = []
    def register():
        wm = bpy.context.window_manager
        kc = wm.keyconfigs.addon
        kmaps = AddonKeymaps.keymaps

        km = kc.keymaps.new(name="Window", space_type='EMPTY', region_type='WINDOW')

        # (1) this one directly calls the operator
        # kmi = km.keymap_items.new(OpenPath.bl_idname, "O", "PRESS", ctrl=True, alt=True)
        # kmi.properties.whichpath = 'C:/' # with a standard path

        # (2) this one calls the menu of the operator
        kmi = km.keymap_items.new("wm.call_menu", "O", "PRESS", ctrl=True, alt=True)
        kmi.properties.name = OpenPathMenu.bl_idname

        kmaps.append((km, kmi))
        print(kmaps)
    
    def unregister():
        wm = bpy.context.window_manager
        kmaps = AddonKeymaps.keymaps
        for km, kmi in kmaps:
            km.keymap_items.remove(kmi)

        kmaps.clear()

def register():
    print("registered addon")
    bpy.utils.register_class(OpenPath)
    bpy.utils.register_class(OpenPathMenu)
    AddonKeymaps.register()

def unregister():
    print("unregistered addon")
    bpy.utils.unregister_class(OpenPath)
    bpy.utils.unregister_class(OpenPathMenu)
    AddonKeymaps.unregister()    

if __name__ == "__main__":
    register()
1 Like

Thank you very much for your time! It’s great detail…
I got it that needed an independent class for adding keymap! I learned a lot from that structure.
Thank you! :slight_smile: