如何从另一个 django 项目执行 django 命令?

How to execute django commands from another django project?

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

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

项目2:仅用于执行django命令,不运行ning。

我想 运行 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 项目之外工作。

好的,我通过在命令末尾添加 --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'")