自定义Django(或任何Python模块)的安装位置

0 投票
4 回答
1117 浏览
提问于 2025-04-15 15:29

我想把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 个回答

0

作为一个快速检查,我建议你把

~/code/packages/install

换成

/full_path_to_your_user/code/packages/install

1

好的,我最近在查看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'

希望除了我以外,还有其他人觉得这个有用!

2

我强烈建议你看看 VirtualenvPip,这两个工具可以帮助你创建一个个独立的Python包环境。

现在,Pinax项目专门使用这些工具来打包需求,方便其他人使用。它在可重用应用程序领域越来越成为一种默认标准。

撰写回答