自定义Django(或任何Python模块)的安装位置
我想把Django安装到一个自定义的位置。我看过distutils的文档,上面说我可以像下面这样做,把它安装到我的主目录(在解压后的django压缩包中运行)。
> python setup.py install --home=~/code/packages/install --install-purelib=modules --install-platlib=modules --install-scripts=scripts --install-data=data
但是,每次我这样做的时候,它似乎没有把主路径和其他路径连接起来,结果我只得到了
modules/
scripts/
data/
在解压后的压缩包目录中。也就是说,它似乎把模块、脚本等当作是相对于本地目录的路径,而不是相对于我指定的--home路径。
我试过用--prefix设置根目录,还用过setup.cfg,但都没有效果。单独使用--prefix和--home是可以的,但当它们和--install-xxx一起使用时就不行了。
我可能在做一些傻事,或者文档有问题,或者是有bug。任何帮助都非常感谢。
4 个回答
作为一个快速检查,我建议你把
~/code/packages/install
换成
/full_path_to_your_user/code/packages/install
好的,我最近在查看distutils的源代码,想搞清楚它是怎么工作的。distutils.command.install
负责处理所有的路径操作。
结果发现,文档上写的其实是不对的。每当你提供一个以--install-xxxx开头的选项时,它会完全覆盖任何可能从--home
或--prefix
得到的值——代码并不会简单地把路径拼接在一起。
不过,它实际上做的是用一组特殊变量进行替换。我特别关注的一个变量是$base
。在命令行中使用它,你可以定义这些覆盖项,distutils会把所有出现的地方替换成你为--home
等指定的内容。但要注意,你必须把文件名用引号括起来,这样BASH才不会把它当作环境变量来扩展。
所以我最开始的命令行,变成了:
python setup.py install --home=/home/andre/code/packages/install --install-purelib='$base/modules' \
--install-platlib='$base/modules' --install-scripts='$base/scripts' --install-data='$base/data'
希望除了我以外,还有其他人觉得这个有用!
我强烈建议你看看 Virtualenv 和 Pip,这两个工具可以帮助你创建一个个独立的Python包环境。
现在,Pinax项目专门使用这些工具来打包需求,方便其他人使用。它在可重用应用程序领域越来越成为一种默认标准。