我有一个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>
这是正常行为吗?感觉很不稳定。
答案 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 []
# 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尝试压缩你的包,无论你如何安装它。