Debian 7 + django + gunicorn + virtualenv:site-packages的egg-link不在pythonpath中

0 投票
1 回答
1699 浏览
提问于 2025-04-18 11:08

背景:

  • 使用的是 Debian 7 系统
  • 安装了 gunicorn(是通过 Debian 的软件包安装的,这样可以使用 /etc/gunicorn.d 的配置)
  • 项目的依赖包是通过 pip 在一个虚拟环境中安装的

依赖包是通过命令 pip install -r requirements.txt 安装的。在这个文件里,我们有 3 个来自 GitHub 仓库的包。

比如:

-e git+https://github.com/truc/bidule.git#egg=bidule-master

这是我的 gunicorn.d 配置:

CONFIG = {
    'mode': 'django',
    'environment': {
        'PYTHONPATH': '/path/to/my/django/project/:/path/to/virtualenv/lib/python2.7/site-packages/',
    'PRODUCTION': '1',
     },
    'working_dir': '/path/to/my/django/project/',
    'user': 'user',
    'group': 'group',
    'args': (
        '--bind=127.0.0.1:8090',
        '--workers=3',
        # '--worker-class=egg:gunicorn#sync',
        #'--timeout=30',
    #'--preload',
    'myproject.settings'
    ),
}

但是这 3 个 GitHub 包并不在 /path/to/virtualenv/lib/python2.7/site-packages/ 目录下,所以找不到这些模块。

我注意到有一个文件:bidule.egg-link,它里面包含了指向 /path/to/virtualenv/src/bidule-master 的路径。

目前我找到的唯一解决办法是手动把这些包的路径添加到 gunicorn.d 配置里的 PYTHONPATH 中。

'PYTHONPATH': '/path/to/my/django/project/:/path/to/virtualenv/src/bidule-master/:/path/to/virtualenv/lib/python2.7/site-packages/',

我的问题是,有没有办法不需要手动把每个 GitHub 包都放到 pythonpath 里?

谢谢

1 个回答

3

首先,Gunicorn这个工具专门为Django设计的模式已经不再使用了,Django 1.7之后就不支持了。你可以查看这两个链接了解更多信息:https://github.com/benoitc/gunicorn/issues/705https://docs.djangoproject.com/en/1.7/howto/deployment/wsgi/gunicorn/

针对你的具体问题,不要去调整 $PYTHONPATH,而是尝试把 'python' 这个键设置为你虚拟环境中的python二进制文件。这样系统应该能自动找到模块的位置。

以下是Django 1.7的完整配置:

CONFIG = {
    # Default mode is WSGI
    'working_dir': '/path/to/my/django/project/',
    'python': '/path/to/virtualenv/bin/python',
    'user': 'user',
    'group': 'group',
    'args': (
        '--bind=127.0.0.1:8090',
        '--workers=3',
        # '--worker-class=egg:gunicorn#sync',
        #'--timeout=30',
        #'--preload',
        'myproject.wsgi'
    ),
}

撰写回答