簡體   English   中英

通過 PyCharm 運行 shell_plus?

[英]Run shell_plus through PyCharm?

有沒有辦法讓我配置 PyCharm 來運行shell_plus而不是默認的 shell?

我嘗試將管理命令的文本放在“啟動腳本”中,但隨后我得到了以下 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")

它並沒有真正運行 shell_plus。

似乎“啟動腳本”發生在默認值之外而不是默認值。

Shell_plus 自動導入所有 Django 模型類等。

我通過掛鈎到 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

我一直在尋找同樣問題的解決方案,我最終來到了這里。 我嘗試了其他人提出的解決方案,但似乎沒有一個能解決這個問題。 所以我決定尋找另一個解決方案。 這就是我想出的:

下面的代碼塊是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 控制台部分。 然后在啟動腳本窗口中進行更改並應用。 最后,啟動新的Python 控制台實例。

我查看了shell_plus的源代碼,並注意到您可以在名為get_imported_objects({})Command類上使用一個方法

在 PyCharm 中,轉到:構建、執行、部署 > 控制台 > Django 控制台 > 啟動腳本

將此添加到該框中的現有代碼中:

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

這不是一個完整的答案,但我發現 這個腳本至少加載了所有應用程序模型。 把它放在設置 > 控制台 > 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

我還向JetBrains提交了這個功能請求。

解決此問題的一種方法是創建一個新的 Python 運行配置。 將目標設置為模塊,並為項目選擇manage.py文件。 然后將shell_plus放在參數字段中。 將工作目錄設置為項目目錄。 最后,將 Execution 設置為Run with Python Console 應用更改,然后運行新配置。

PyCharm 運行/調試配置的屏幕截圖

在 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

由於django.db.models.get_models不再存在,這里有一個更新版本,它將完成與 Christopher Mason 版本相同的功能。

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

django shell 運行配置

這個配置對我有用

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM