没有解压缩.egg时找不到管理命令

时间:2013-06-20 00:22:38

标签: django

我有一个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>

这是正常行为吗?感觉很不稳定。

2 个答案:

答案 0 :(得分:3)

我强烈建议您使用pip代替setup.py。它往往能够更好地安装软件包以及管理它们。

准备好虚拟环境后,它将是:

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

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

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

$ pip install http://[URL_TO_ZIP]

答案 1 :(得分:2)

我们来看看the part of the source that loads management commands

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 []

is called by

# 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所说,通过pip安装将把包保存在目录中而不是压缩它。您也可以(也可能 )在zip_safe=False命令中设置setup();这将阻止setuptools / distribute / etc尝试压缩你的包,无论你如何安装它。