5

我有一个 django 应用程序,我根据此处的文档打包: https ://docs.djangoproject.com/en/1.5/intro/reusable-apps/

我使用 setup.py 将应用程序安装到虚拟环境中。

./setup.py install

该应用程序的 Web UI 在虚拟环境中运行良好。但是我无法通过这个 vanilla 安装访问自定义管理命令。

(django_grm)[grm@controller django_grm]$ python ./manage.py sync_to_graphite
Unknown command: 'sync_to_graphite'

以下是命令不执行时虚拟环境的样子:

(django_grm)[grm@controller django_grm]$ ll /home/grm/venv/django_grm/lib/python2.7/site-packages
total 1148
...
-rw-rw-r--  1 grm grm 243962 Jun 19 17:11 django_grm-0.0.4-py2.7.egg
...

但是,一旦我解压缩 .egg 文件,管理命令就会按预期工作。

(django_grm)[grm@controller django_grm]$ cd /home/grm/venv/django_grm/lib/python2.7/site-packages
(django_grm)[grm@controller site-packages]$ unzip django_grm-0.0.4-py2.7.egg 

(django_grm)[grm@controller site-packages]$ ll /home/grm/venv/django_grm/lib/python2.7/site-packages
total 1152
...
-rw-rw-r--  1 grm grm 243962 Jun 19 17:11 django_grm-0.0.4-py2.7.egg
drwxrwxr-x  6 grm grm   4096 Jun 19 17:16 dj_grm
...

(django_grm)[grm@controller site-packages]$ cd /home/grm/django_projects/django_grm/
(django_grm)[grm@controller django_grm]$ python ./manage.py sync_to_graphite

<success>

这是正常行为吗?感觉很不靠谱

4

2 回答 2

3

我强烈建议使用pip而不是setup.py. 它在安装和管理软件包方面往往做得更好。

一旦你的虚拟环境就位,它将是:

$ . env/bin/activate
$ pip install [APP_NAME]

这会在虚拟环境中安装应用程序的非压缩版本。

如果该应用程序是来自某个地方的 zip,您仍然可以使用pip

$ pip install http://[URL_TO_ZIP]
于 2013-06-25T02:08:00.827 回答
2

我们来看一下加载管理命令的源码部分

def find_commands(management_dir):
    """
    Given a path to a management directory, returns a list of all the command
    names that are available.

    Returns an empty list if no commands are defined.
    """
    command_dir = os.path.join(management_dir, 'commands')
    try:
        return [f[:-3] for f in os.listdir(command_dir)
                if not f.startswith('_') and f.endswith('.py')]
    except OSError:
        return []

由以下人员调用

# Find and load the management module for each installed app.
for app_name in apps:
    try:
        path = find_management_module(app_name)
        _commands.update(dict([(name, app_name)
                               for name in find_commands(path)]))
    except ImportError:
        pass # No management module - ignore this app

所以,是的,Django 不支持安装在压缩文件中的应用程序,至少在这里;它需要一个明确的commands目录management_dir


正如@tghw 所说,安装 viapip会将包保存在一个目录中,而不是压缩它。您也可以(并且可能也应该zip_safe=False在您的setup()命令中设置;这将阻止 setuptools/distribute/etc 尝试压缩包,无论您如何安装它。

于 2013-06-25T02:16:25.637 回答