使用manage.py syncdb时,Django没有在virtualenv中找到应用程序

时间:2010-08-24 19:24:04

标签: django virtualenv django-south django-manage.py

我的问题是让manage.py syncdb在virtualenv中运行。

它在某一点上工作正常,但是当我安装South并更新pip并分发时,似乎已经破坏了。

无论如何,当virtualenv被激活时,我可以在交互式解释器中导入应用程序。通过mod_wsgi运行,也会导入应用程序,并且该站点可以运行。

当我运行manage.py syncdb时,它无法在我的virtualenv中的INSTALLED_APPS中找到任何应​​用程序。它可以很好地获取系统安装的应用程序,但在尝试仅导入virtualenv应用程序时失败。

2 个答案:

答案 0 :(得分:5)

嗨这是一个老问题,但看不到答案。不确定你要做什么,但基本上有两种模式你可以使用virtualenv,

  1. 用于开发,创建自包含环境
  2. 用于部署,以创建自包含环境
  3. 在第一种情况下,您需要首先使用源venv / bin / activate激活您的virtualenv,因为在部署时,您需要确保为您的网站代码激活virtualenv。我个人更喜欢以下方法来确保您的路径设置正确。 (我在开发时也将它添加到我的manage.py中,所以我不必担心首先激活环境。

    修改了manage.py

    #!/usr/bin/env python
    import os.path
    
    # Cater for Virtual env, add to sys.path
    pwd = os.path.abspath(os.path.dirname(__file__))
    project = os.path.basename(pwd)
    new_path = pwd.strip(project)
    activate_this = os.path.join(new_path,'venv','bin','activate_this.py')
    execfile(activate_this, dict(__file__=activate_this))
    
    from django.core.management import execute_manager
    try:
        import settings # Assumed to be in the same directory.
    except ImportError:
        import sys
        sys.stderr.write("Error: Can't find the file 'settings.py' in the directory containing %r. It appears you've customized things.\nYou'll have to run django-admin.py, passing it your settings module.\n(If the file settings.py does indeed exist, it's causing an ImportError somehow.)\n" % __file__)
        sys.exit(1)
    
    if __name__ == "__main__":
        execute_manager(settings)
    

    这是有效的,由于我如何构建我的项目,你必须将它改为你的目录结构。我的项目结构如下:

    TopLevelDir
    |
    |- Project DIR
    |- venv
    |- requirements 
    |- deployment configs
    

答案 1 :(得分:3)

我有一个简单的解决方案

只需从虚拟环境的bin中的python启动manage.py即可。

所以说你的python在这里/ home / tom / environments / my_env / bin / python你可以像这样启动manage.py:

/ home / tom / environments / my_env / bin / python manage.py syncdb

然后只需在django项目中创建一个符号链接到虚拟环境的python,并将其命名为env_python,然后就可以执行此操作:

./ env_python manage.py syncdb