python安装程序安装在激活的virtualenv之外

我有一个使用setuptools的python安装程序代码,我有python代码安装在/ usr / share / mypackage(由root拥有),但我试图安装程序包作为非特权用户。 所以,我在用户拥有的$ENVDIR目录下创build一个虚拟环境(带有virtualenv )。 然后,激活虚拟环境( source $ENVDIR/bin/activate )之后,我运行python /usr/share/mypackage/setup.py install

问题是运行setup.py install尝试在/usr/share/mypackage内创build一个package.egg-info(或者类似的东西)文件,这显然会触发权限被拒绝的错误,除非我以root身份运行安装程序不是我所需要的…

所以,问题是: 如何解决这个问题,而不是以root身份运行setup.py? 也就是说,如何防止setup.py写入/ usr / share / mypackage?

您不能作为非特权用户安装到/usr/share任何解决办法将违反unix权限。 公平地说,你永远不应该在/usr/share默认安装任何东西。 /usr/share是操作系统/发行版的区域,手动安装软件时不能插手,正确的地方是/usr/local/share 。 参考: FHS规范

打包软件默认安装在/usr/local但允许交换机更改此路径。 编译发行版的人将前缀更改为/usr ,而不可能更改前缀,否则操作系统永远不会编译! 和python和setuptools没有什么不同,他们有这样的前缀开关。

setuptools您可以定义相对于分布根目录的目录 。 setup.py使用绝对路径是非常糟糕的 。 默认情况下, 分发根是由sys.prefix定义的。 而且setuptools有--prefix开关,从命令行改变这个值。 您应该将您的软件包安装为非特权用户,如下所示:

 setup.py --prefix=~/local 

现在,一个virtualenv激活脚本设置VIRTUAL_ENV环境变量。 在virtualenv里面你可以使用哪个:

 setup.py --prefix=$VIRTUAL_ENV 

(这是什么pip


附录

我知道python默认设置sys.prefix'/usr' 。 因此鼓励将包直接安装到/usr ,而不是/usr/local 。 然而,这仍然违反了FHS规范,应该避免。