【问题标题】:Run shell_plus through PyCharm?通过 PyCharm 运行 shell_plus?
【发布时间】:2021-02-04 11:56:33
【问题描述】:

有没有办法让我将 PyCharm 配置为运行 shell_plus 而不是默认 shell?

我尝试将管理命令的文本放在“启动脚本”中,但随后我得到了以下内容 django_manage_shell.run("/Users/cmason/counsyl/code/website/counsyl/product") 导入操作系统 导入系统

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")

它并没有真正运行 shell_plus。

似乎“启动脚本”是在默认值之外而不是在默认值之外发生的。

Shell_plus 自动导入所有 Django 模型类,等等。

【问题讨论】:

  • 我可以通过使用 shell_plus 作为自定义运行命令来让它工作。
  • 这行得通,但它没有 PyCharm 命令行完成的优点,而且你不能使用命令行编辑(例如向上和向下箭头)。

标签: python django pycharm


【解决方案1】:

我通过连接到 shell_plus 代码来自动加载模型对象。我将此附加到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

这是在 PyCharm 2018.3.3 Pro 上

为了完整起见,这是启动脚本的全部内容:

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

【讨论】:

  • 我必须在环境变量中添加 DJANGO_SETTINGS_MODULE 及其值。发布,这个脚本完美运行!
【解决方案2】:

我一直在寻找解决同一问题的方法,但最终来到了这里。我尝试了其他人提出的解决方案,但似乎都没有解决这个问题。所以我决定寻找另一个解决方案。这是我想出的:

下面的代码块是PyCharm 2019.2的原始Django Console启动脚本:

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)

安装 IPython 并更改最后两行如下所示以最正确的方式完成:

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

要使其工作:打开 PyCharm 设置 (CTRL+S) 并前往 Django 控制台 部分。然后在 Starting script 窗口中进行更改并应用。最后,启动新的 Python Console 实例。

【讨论】:

  • 谢谢。它就像一个魅力! (我还需要在我的venv中安装ipython
  • 我在 Django 1.8、Python 3.7 和 django-extensions 1.7.4 上工作
【解决方案3】:

我查看了shell_plus 的源代码,发现您可以在名为get_imported_objects({})Command 类上使用方法

在 PyCharm 中,转到:构建、执行、部署 > 控制台 > Django 控制台 > 启动脚本

将此添加到该框中的现有代码中:

from django_extensions.management.commands.shell_plus import Command
globals().update(Command().get_imported_objects({}))

【讨论】:

  • 这适用于 Django 3.1、django-extensions 2.2.3、Python 3.8
【解决方案4】:

解决此问题的一种方法是创建新的 Python 运行配置。将目标设置为模块,并为项目选择manage.py 文件。然后在参数字段中输入shell_plus。将工作目录设置为项目目录。最后,将执行设置为Run with Python Console。应用更改,然后运行新配置。

【讨论】:

    【解决方案5】:

    这不是一个完整的答案,但我发现this script 至少加载了所有应用程序模型。把它放在设置 > 控制台 > Django 控制台 > 启动脚本中:

    import sys
    import logging
    logging.basicConfig(format="%(levelname)-8s %(asctime)s %(name)s %(message)s", datefmt='%m/%d/%y %H:%M:%S', stream=sys.stdout )
    log = logging.getLogger("root")
    
    from django.db.models import get_models
    from django.conf import settings
    from django.core.exceptions import ObjectDoesNotExist, MultipleObjectsReturned
    
    logging.config.dictConfig(settings.LOGGING)
    log.debug("Logging has been initialized at DEBUG")
    log.setLevel( logging.DEBUG)
    log.disabled = False
    
    for _class in get_models():
        if _class.__name__.startswith("Historical"): continue
        log.debug("Registering model {}".format(_class.__name__))
        globals()[_class.__name__] = _class
    
    def debug_sql():
        from debug_toolbar.management.commands import debugsqlshell
        return
    

    我也提交了这个feature request to JetBrains.

    【讨论】:

    【解决方案6】:

    在 Django 1.7 中,以下脚本可用作 PyCharm 3.4 的解决方法:

    文件 -> 设置 -> 控制台 -> Django 控制台和 manage.py 选项

    Starting script,输入:

    import sys
    import django
    django.setup()
    
    from django.db.models import get_models
    
    for _class in get_models():
        globals()[_class.__name__] = _class
    

    【讨论】:

      【解决方案7】:

      这个配置适合我

      【讨论】:

        【解决方案8】:

        由于django.db.models.get_models 不再存在,这里有一个更新版本,将与克里斯托弗梅森的版本相同。

        import sys; print('Python %s on %s' % (sys.version, sys.platform))
        import django; print('Django %s' % django.get_version())
        import logging
        logging.basicConfig(format="%(levelname)-8s %(asctime)s %(name)s %(message)s", datefmt='%m/%d/%y %H:%M:%S', stream=sys.stdout )
        log = logging.getLogger("root")
        
        from django.apps import apps
        from django.conf import settings  
        from django.core.exceptions import ObjectDoesNotExist, MultipleObjectsReturned
        
        logging.config.dictConfig(settings.LOGGING)
        log.debug("Logging has been initialized at DEBUG")
        log.setLevel( logging.DEBUG)
        log.disabled = False
        
        for _configs in apps.get_app_configs():
            for _class in _configs.get_models():
                if _class.__name__.startswith("Historical"): continue
                log.debug("Registering model {}".format(_class.__name__))
                globals()[_class.__name__] = apps.get_model(_configs.label, _class.__name__)
        
        def debug_sql():
            from debug_toolbar.management.commands import debugsqlshell
            return
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-06-08
          • 1970-01-01
          • 1970-01-01
          • 2020-07-21
          • 2017-04-23
          • 2017-06-23
          • 1970-01-01
          • 2021-07-24
          相关资源
          最近更新 更多