Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Run shell_plus through PyCharm?

Is there a way for me to configure PyCharm to run shell_plus instead of the default shell?

I've tried putting the text of the manage command in the 'Starting script' but then I get the folloiwing django_manage_shell.run("/Users/cmason/counsyl/code/website/counsyl/product") import os import sys

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings")

    # The new Django 1.4 default manage.py wants "from django..." before
    # importing settings, but we usually tinker with sys.path in
    # settings_local.py, which is called from settings.py. Importing
    # settings.py works but does mean some double importing. Luckily that
    # module does very little work.
    import settings
    # appease pyflakes; don't ever do this in
    # non-super-meta-namespace-trickery code
    settings

    from django.core.management import execute_from_command_line

    execute_from_command_line("shellplus")

and it hasn't really run shell_plus.

It seems like the 'Starting script' happens in addition to rather than instead of the default.

Shell_plus automatically imports all Django model classes, among other things.

like image 685
Christopher Mason Avatar asked Nov 08 '13 21:11

Christopher Mason


3 Answers

I got the model objects auto-loading by hooking into the shell_plus code. I appended this to the default startup script in Preferences > Build, Execution, Deployment > Console > Django Console:

from django_extensions.management import shells
from django.core.management.color import color_style
imported_items = shells.import_objects({}, color_style())
for k, v in imported_items.items():
    globals()[k] = v

This was on PyCharm 2018.3.3 Pro

For completeness, this was the full content of starting script:

import sys; print('Python %s on %s' % (sys.version, sys.platform))
import django; print('Django %s' % django.get_version())
sys.path.extend([WORKING_DIR_AND_PYTHON_PATHS])
if 'setup' in dir(django): django.setup()
import django_manage_shell; django_manage_shell.run(PROJECT_ROOT)

from django_extensions.management import shells
from django.core.management.color import color_style
imported_items = shells.import_objects({}, color_style())
for k, v in imported_items.items():
    globals()[k] = v
like image 131
chrisbunney Avatar answered Oct 22 '22 09:10

chrisbunney


I've been looking for a solution to the same problem, and I ended up here. I tried solutions proposed by others, but none of those appeared to solve this issue. So I decided to find another solution. This is what I came up with:

The code block below is the original Django Console starting script of PyCharm 2019.2:

import sys, django
print('Python %s on %s' % (sys.version, sys.platform))
print('Django %s' % django.get_version())
sys.path.extend([WORKING_DIR_AND_PYTHON_PATHS])
if 'setup' in dir(django):
    django.setup()
import django_manage_shell
django_manage_shell.run(PROJECT_ROOT)

Installing IPython and changing the last two lines as below gets it done in the most proper way:

from IPython.core.getipython import get_ipython
ipython = get_ipython()
from django_extensions.management.notebook_extension import load_ipython_extension
load_ipython_extension(ipython)

To make it work: open PyCharm settings (CTRL+S) and head to Django Console section. Then make changes in Starting script window and apply. Finally, start the new Python Console instance.

like image 33
Sencer H. Avatar answered Oct 22 '22 09:10

Sencer H.


I looked at the source code of shell_plus, and noticed you could use a method on a Command class named get_imported_objects({})

In PyCharm, go to: Build, Execution, Deployment > Console > Django Console > Starting script

Add this to the existing code in that box:

from django_extensions.management.commands.shell_plus import Command
globals().update(Command().get_imported_objects({}))
like image 35
Jarad Avatar answered Oct 22 '22 09:10

Jarad