1
$\begingroup$

I'm trying to change the prompt string to the left of the Python Console.

Setting bpy.context.space_data.prompt, either directly or via an operator, will change it only in the scrollback for that in which one did so, after which it reverts to the default ">>> ". Perhaps bpy.ops.console.execute() is resetting it.

Is there a way to make it stick?

$\endgroup$

1 Answer 1

0
$\begingroup$

I made it work by wrapping bpy.console.execute(), then setting it afterward:

import bpy
class CONSOLE_OT_execute_wrapper(bpy.types.Operator):
    """Wraps command execution to maintain the current prompt."""
    bl_idname="console.execute_wrapper"
    bl_label="Execute Wrapper"
    interactive=bpy.props.BoolProperty(name="Interactive",description="Whatever the \"interactive\" property does for bpy.ops.console.execute.",default=False)
    prompt=bpy.props.StringProperty(name="Prompt",description="String that shows to the left of the current command.")
    @classmethod
    def poll(cls,C):
        return C.area.type=="CONSOLE"
    def execute(self,C):
        print("CONSOLE_OT_execute_wrapper.execute(%s,%s)"%(self,C))
        bpy.ops.console.execute(interactive=self.interactive)
        C.space_data.prompt=self.prompt
        return {'FINISHED'}
def register():
    bpy.utils.register_class(CONSOLE_OT_execute_wrapper)
    for kmi in [kmi for kc in bpy.context.window_manager.keyconfigs for km in kc.keymaps for kmi in km.keymap_items if kmi.idname=="console.execute"]:kmi.idname+="_wrapper"#Wrap
def unregister():
    bpy.utils.unregister_class(CONSOLE_OT_execute_wrapper)
    for kmi in [kmi for kc in bpy.context.window_manager.keyconfigs for km in kc.keymaps for kmi in km.keymap_items if kmi.idname=="console.execute_wrapper"]:kmi.idname=kmi.idname[:kmi.idname.rindex("_")]#Unwrap
if __name__=="__main__":register()

After running the above in the text editor, for now you can then set the prompt in User Preferences->Input, where you expand "Console", find each "Execute Wrapper" and set their "prompt" property. I'll put the option somewhere appropriate in the addon.

$\endgroup$
4
  • 2
    $\begingroup$ Are you able to expand your answer by showing how you did that? $\endgroup$ Mar 29, 2017 at 15:30
  • $\begingroup$ Python by itself uses sys.ps1 and sys.ps2 for the interactive prompts; might want to check if blenderpython respects that. docs.python.org/3/library/sys.html?highlight=sys.ps1#sys.ps1 $\endgroup$
    – Weaver
    Mar 30, 2017 at 6:38
  • $\begingroup$ Added. It's part of a console shellification module I'll soon upload. $\endgroup$
    – Blitzen
    Apr 1, 2017 at 1:27
  • $\begingroup$ @StarWeaver: Apparently not: AttributeError: module 'sys' has no attribute 'ps1' Good thinking, in any case. $\endgroup$
    – Blitzen
    Apr 3, 2017 at 22:18

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .