【问题标题】:python setup installing outside of activated virtualenvpython setup安装在激活的virtualenv之外
【发布时间】:2016-11-04 01:19:30
【问题描述】:

我在 python 中有一个使用 setuptools 的设置代码,并且我有 python 代码安装在 /usr/share/mypackage(由 root 拥有)中,但我试图以非特权用户身份安装包。因此,我在用户拥有的目录$ENVDIR 中创建了一个虚拟环境(使用virtualenv)。然后,在激活虚拟环境后(使用source $ENVDIR/bin/activate),我运行python /usr/share/mypackage/setup.py install

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

所以,问题是:如何在不以 root 身份运行 setup.py 的情况下解决此问题?也就是说,如何防止 setup.py 写入 /usr/share/mypackage?

【问题讨论】:

    标签: python linux debian setuptools packaging


    【解决方案1】:

    您不能以非特权用户身份安装到 /usr/share 中,任何解决方法都会违反 unix 权限。公平地说,你不应该在默认情况下在/usr/share 中安装任何东西。 /usr/share 是 OS/distro 领域,手工安装软件时不要插手,正确的位置是 /usr/local/share。参考:The FHS spec

    默认情况下,打包软件会自行安装在 /usr/local 上,但允许交换机更改此路径。编译发行版的人将 prefix 更改为 /usr,如果没有更改前缀的可能性,操作系统将永远不会被编译!而python和setuptools也没有什么不同,它们都有这样的前缀开关。

    setuptools 中定义相对于distribution root 的目录。在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 规范,应该避免。

    【讨论】:

    • 可能我不清楚...安装目录是不是 /usr/share。至少它不应该是......当运行我的 debian 包的 apt-get install 时,我只是将 python 源文件放在 /usr/share 中,但实际的 python setup.py install 由守护程序用户运行(我创建一个用户和一个组只是为了运行我安装的守护程序):在守护程序启动脚本中,调用python setup.py install,它试图写入/usr/share,即使我输入python setup.py install --prefix=$ENVDIR...
    猜你喜欢
    • 2017-02-17
    • 2019-06-04
    • 1970-01-01
    • 2014-04-23
    • 2018-07-11
    • 2016-03-02
    • 1970-01-01
    • 2019-10-26
    相关资源
    最近更新 更多