运行 Django 服务器通过从另一个 Django 项目调用子进程

run Django server by calling subprocess from another Django project

我有两个Django项目,foobar,结构如下图

/tmp/foo
  - foo
    - __init__.py
    - settings.py
    - urls.py
    - wsgi.py

/tmp/bar
  - bar
    - __init__.py
    - settings.py
    - urls.py
    - wsgi.py

我尝试在 foo 的环境中 运行 python3 /tmp/bar/manage.py runserver 但失败了。

$ python3 /tmp/foo/manage.py shell

>>> import subprocess
>>> subprocess.call(['python3', '/tmp/bar/manage.py', 'runserver'])

Traceback (most recent call last):
  File "/tmp/bar/manage.py", line 10, in <module>
    execute_from_command_line(sys.argv)
  File "/usr/local/lib/python3.4/dist-packages/django/core/management/__init__.py", line 353, in execute_from_command_line
    utility.execute()
  File "/usr/local/lib/python3.4/dist-packages/django/core/management/__init__.py", line 302, in execute
    settings.INSTALLED_APPS
  File "/usr/local/lib/python3.4/dist-packages/django/conf/__init__.py", line 55, in __getattr__
    self._setup(name)
  File "/usr/local/lib/python3.4/dist-packages/django/conf/__init__.py", line 43, in _setup
    self._wrapped = Settings(settings_module)
  File "/usr/local/lib/python3.4/dist-packages/django/conf/__init__.py", line 99, in __init__
    mod = importlib.import_module(self.SETTINGS_MODULE)
  File "/usr/lib/python3.4/importlib/__init__.py", line 109, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 2254, in _gcd_import
  File "<frozen importlib._bootstrap>", line 2237, in _find_and_load
  File "<frozen importlib._bootstrap>", line 2212, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 321, in _call_with_frames_removed
  File "<frozen importlib._bootstrap>", line 2254, in _gcd_import
  File "<frozen importlib._bootstrap>", line 2237, in _find_and_load
  File "<frozen importlib._bootstrap>", line 2224, in _find_and_load_unlocked
ImportError: No module named 'foo'
1

我该如何解决这个问题?

(我知道这种行为根本没有意义,但这只是为了演示目的。)

你是对的,它根本没有任何意义 :-) 但是如果你真的想这样做,你需要覆盖 DJANGO_SETTINGS_MODULE 环境变量:

>>> import subprocess
>>> import os
>>> os.environ['DJANGO_SETTINGS_MODULE'] = 'bar.settings'
>>> subprocess.call(['python3', '/tmp/bar/manage.py', 'runserver'])
Performing system checks...

System check identified no issues (0 silenced).
May 26, 2016 - 15:52:08
Django version 1.9.6, using settings 'bar.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.