【问题标题】:run Django server by calling subprocess from another Django project通过从另一个 Django 项目调用子进程来运行 Django 服务器
【发布时间】:2016-09-24 17:21:07
【问题描述】:

我有两个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 python-3.x subprocess


    【解决方案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.
    

    【讨论】:

    • 其实我想做的是通过从foo发送命令来操纵bar的模型(我希望这更有意义)
    • 这有点道理,尽管恕我直言,通过 HTTP API 发送命令会更方便。您是否尝试过上述解决方案?它奏效了吗?如果没有,发生了什么?
    • 一切正常,谢谢。但是,如果我更改os.environ['DJANGO_SETTINGS_MODULE'],会有任何副作用吗?我还是想保留原来的环境。
    • 我不相信有任何副作用,因为在运行 shell 之前已经加载了设置。
    • 我的回答解决了你的问题吗?如果是,您可以将其标记为正确吗?如果没有,发生了什么?
    猜你喜欢
    • 1970-01-01
    • 2019-03-31
    • 2015-12-05
    • 2021-07-09
    • 2014-11-23
    • 2018-03-18
    • 2015-08-05
    • 2017-04-23
    • 2015-11-18
    相关资源
    最近更新 更多