【问题标题】:How to execute django commands from another django project?如何从另一个 django 项目执行 django 命令?
【发布时间】:2021-05-05 14:40:01
【问题描述】:

我在同一台服务器上有两个 django 项目。

项目 1:正在运行(使用 gunicorn)以接收休息请求并显示数据。

项目2:仅用于执行django命令,并没有运行。

我想从 project1 中的 project2 运行一个命令,但是当我什么都不做时。

我试过了:

Popen(["/opt/xxx/venv3/bin/python", "/opt/xxx/src/manage.py", "custom_commands", "params"])
os.system("/opt/xxx/venv3/bin/python /opt/xxx/src/manage.py custom_commands params")

没有成功(我试图读取 Popen 的输出,但它是空的)。

当我在服务器上的 python shell 中运行相同的命令时,它可以工作,因此它必须与从另一个 django 项目调用 django 命令有关。

----编辑----

我设法用 popen 读取了 stderr 并得到了:

Traceback (most recent call last):\n  File "/opt/project2/venv3/lib/python3.9/site-packages/django/core/management/__init__.py", line 224, in fetch_command\n    app_name = commands[subcommand]\nKeyError: \'mail_lre\'\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File "/opt/project2/src/manage.py", line 22, in <module>\n    main()\n  File "/opt/project2/src/manage.py", line 18, in main\n    execute_from_command_line(sys.argv)\n  File "/opt/project2/venv3/lib/python3.9/site-packages/django/core/management/__init__.py", line 401, in execute_from_command_line\n    utility.execute()\n  File "/opt/project2/venv3/lib/python3.9/site-packages/django/core/management/__init__.py", line 395, in execute\n    self.fetch_command(subcommand).run_from_argv(self.argv)\n  File "/opt/project2/venv3/lib/python3.9/site-packages/django/core/management/__init__.py", line 231, in fetch_command\n    settings.INSTALLED_APPS\n  File "/opt/project2/venv3/lib/python3.9/site-packages/django/conf/__init__.py", line 82, in __getattr__\n    self._setup(name)\n  File "/opt/project2/venv3/lib/python3.9/site-packages/django/conf/__init__.py", line 69, in _setup\n    self._wrapped = Settings(settings_module)\n  File "/opt/project2/venv3/lib/python3.9/site-packages/django/conf/__init__.py", line 170, in __init__\n    mod = importlib.import_module(self.SETTINGS_MODULE)\n  File "/usr/local/lib/python3.9/importlib/__init__.py", line 127, in import_module\n    return _bootstrap._gcd_import(name[level:], package, level)\n  File "<frozen importlib._bootstrap>", line 1030, in _gcd_import\n  File "<frozen importlib._bootstrap>", line 1007, in _find_and_load\n  File "<frozen importlib._bootstrap>", line 972, in _find_and_load_unlocked\n  File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed\n  File "<frozen importlib._bootstrap>", line 1030, in _gcd_import\n  File "<frozen importlib._bootstrap>", line 1007, in _find_and_load\n  File "<frozen importlib._bootstrap>", line 986, in _find_and_load_unlocked\n  File "<frozen importlib._bootstrap>", line 680, in _load_unlocked\n  File "<frozen importlib._bootstrap_external>", line 790, in exec_module\n  File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed\n  File "/opt/editik/src/Editik_django/__init__.py", line 4, in <module>\n    from utils.apps import app_ready\n  File "/opt/project2/src/utils/apps.py", line 15, in <module>\n    from api.settings import LOG_EDITIK_DIR\n  File "/opt/project2/src/api/__init__.py", line 4, in <module>\n    from utils.apps import app_ready\nImportError: cannot import name \'app_ready\' from partially initialized module \'utils.apps\' (most likely due to a circular import) (/opt/project2/src/utils/apps.py)

真的很奇怪,因为它在 django 项目之外工作。

【问题讨论】:

    标签: python django command


    【解决方案1】:

    好的,我通过在命令末尾添加 --pythonpath 和 --settings 解决了这个问题。

    喜欢:

    Popen(["/opt/xxx/venv3/bin/python", "/opt/xxx/src/manage.py", "custom_commands", "params", "--pythonpath='/opt/xxx/src/'", "--settings='api.settings'"])
    
    os.system("/opt/xxx/venv3/bin/python /opt/xxx/src/manage.py custom_commands params --pythonpath='/opt/xxx/src/' --settings='app.settings'")
    

    【讨论】:

      猜你喜欢
      • 2022-07-25
      • 2012-05-28
      • 2011-06-15
      • 2019-05-16
      • 1970-01-01
      • 1970-01-01
      • 2019-06-27
      • 2012-05-17
      • 1970-01-01
      相关资源
      最近更新 更多