我有一个使用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规范,应该避免。