在/ tmp文件夹中,权限被拒绝的python3 venv中的PIP安装失败

时间:2017-10-02 17:48:08

标签: python-3.x pip virtualenv

似乎有几种方法可以达到相同的错误,我描述的是最典型的错误。

我在共享主机服务器上编译了python 3.6.2,我没有sudo权限(尽管它在cgi-bin中运行良好)。后来我发现它也发生在Ubuntu 16.04上。我在尝试:

my-python3-path/bin/python3 -m venv my-venv-folder

最后以

结束
  

错误:命令'['... my-venv-folder / bin / python3',' - Im','ensurepip',' - upgrade',' - default-pip']'返回非零退出状态1.

我可以尝试另一种方式:

my-python3-path/bin/python3 -m venv --without-pip my-venv-folder

成功,然后

my-venv-folder/bin/python -m ensurepip

(或上面结果建议的更多选项) - 无论如何都以:

结束
  

OSError:[Errno 22]参数无效:'/ tmp / tmpt2cathtr'

并且稍高于以:

结尾的堆栈跟踪
  

PermissionError:[Errno 13]权限被拒绝:'/ tmp / pip-build-exot00s _'

虽然这样所有必要的脚本(例如激活)都是在pip之前在venv中创建的,而pip文件本身似乎存在并且正常工作,直到我真的尝试安装任何东西。然后存在类似的错误。

更改TMPDIR似乎没有帮助 - 使用相同的/ tmp文件夹。

顺便说一句make install期间发生了相同或类似的错误......

有问题的子文件夹(/tmp中的子文件夹具有d-w-------访问权限,因此难怪无法访问它们。

如果有人遇到这个问题,请分享一下,如果你找到解决办法摆脱它(虽然目前状态最后一个变种看起来像变通办法),因为我没有找到谷歌的解决方案。对不起,如果描述不是很连贯,因为我不是蟒蛇人,各种尝试和谷歌搜索让我有点头晕。提前谢谢!

UPD 似乎是为用户创建了rwx权限的临时目录,但稍后该模式变为-w-rmtree失败。当前的解决方法似乎是在这些地方(其中几个)注释掉rmtree次来电......

2 个答案:

答案 0 :(得分:1)

我认为我找到了一个有效的修复/解决方法。

问题是由/tmp/pip...子目录中的奇怪变化引起的。访问权限 - 他们最终成为"只写"因此pip在各个阶段被调用rmtree失败了。

我的解决方案是:

  1. 设置venv,无需点击
  2. 手动从pypi下载pip包并将其放入venv
  3. 在pip / utils中修复rmtree
  4. 使用pip安装setuptools
  5. 现在它正在工作(虽然应该通过python调用)
  6. 此方法的一个小缺陷是不会自动删除临时文件夹。我要么删除它们(先递归chmodding),要么等待重启。

    详细信息如下:

    创建virtualenv并启动它:

    path-to-python3/bin/python3 -m venv my-venv --without-pip
    source my-venv/bin/activate
    

    让我们改变应安装libs的目录

    cd my-venv/lib/python3.6/site-packages
    

    从官方页面https://pypi.python.org/pypi/pip下载pip(从.whl复制链接)

    wget https://pypi.python.org/packages/.../pip-9.0.1-py2.py3-none-any.whl
    

    现在从中提取pip目录并删除所有其他内容

    unzip pip-9.0.1...whl
    rm *.whl
    rm -r pip-9.0.1.dist-info
    

    现在打开文件pip/utils/__init__.py并更改rmtree功能的标题:

    nano pip/utils/__init__.py
    

    找到行def rmtree(dir, ignore_errors=False):并将False更改为True。然后退出Ctrl-X, Yes

    要正常工作pip想拥有setuptools,幸运的是我们现在可以用pip本身安装它们:

    python -m pip install setuptools
    

    现在可以用它来管理我们需要的所有东西:

    python -m pip install django
    python -m pip freeze
    

    P.S。更智能的方法是在utils / rmtree中递归地尝试chown。

答案 1 :(得分:0)

Python 3.6.4似乎解决了这个问题。