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

Rod*_*nko 6 pip virtualenv python-3.x

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

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

my-python3-path/bin/python3 -m venv my-venv-folder
Run Code Online (Sandbox Code Playgroud)

这最终失败了

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

我可以尝试另一种方式:

my-python3-path/bin/python3 -m venv --without-pip my-venv-folder
Run Code Online (Sandbox Code Playgroud)

哪个成功,然后

my-venv-folder/bin/python -m ensurepip
Run Code Online (Sandbox Code Playgroud)

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

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

有点高于以以下结尾的堆栈跟踪:

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

尽管通过这种方式,所有必要的脚本(例如激活)都是在 pip 之前在 venv 中创建的,并且 pip 文件本身似乎存在并且可以正常工作,直到我真正尝试安装任何东西为止。那么类似的错误存在。

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

make install顺便说一下,同样或类似的错误发生了......

有问题的子文件夹(其中的子文件夹/tmp具有d-w-------访问权限,因此无法访问它们也就不足为奇了)。

如果有人遇到此问题,请分享您是否找到解决方案来摆脱它(尽管目前状态最后一个变体看起来像解决方法),因为我未能通过 google 找到解决方案。对不起,如果描述不是很连贯,因为我不是一个蟒蛇人,各种尝试和谷歌搜索让我有点头晕。提前致谢!

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

Rod*_*nko 1

我想我已经找到了有效的修复/解决方法。

问题是由/tmp/pip...子目录访问权限的奇怪变化引起的 - 它们最终变成“只写”,因此rmtreepip 在各个阶段调用都会失败。

我的解决方案是:

  1. venv没有 pip的设置
  2. 手动从pypi下载pip包并放入venv
  3. rmtree在 pip/utils 中修复
  4. 使用pip安装setuptools
  5. 现在它可以工作了(尽管应该通过 python 调用)

这种方法的一个小缺陷是临时文件夹不会自动删除。我要么删除它们(首先递归修改),要么等待重新启动。


详细来说是这样的:

创建 virtualenv 并启动它:

path-to-python3/bin/python3 -m venv my-venv --without-pip
source my-venv/bin/activate
Run Code Online (Sandbox Code Playgroud)

让我们切换到应该安装库的目录

cd my-venv/lib/python3.6/site-packages
Run Code Online (Sandbox Code Playgroud)

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

wget https://pypi.python.org/packages/.../pip-9.0.1-py2.py3-none-any.whl
Run Code Online (Sandbox Code Playgroud)

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

unzip pip-9.0.1...whl
rm *.whl
rm -r pip-9.0.1.dist-info
Run Code Online (Sandbox Code Playgroud)

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

nano pip/utils/__init__.py
Run Code Online (Sandbox Code Playgroud)

找到该行def rmtree(dir, ignore_errors=False):并更改FalseTrue。然后使用 退出Ctrl-X, Yes

为了正常工作,pip 需要安装工具,幸运的是我们现在可以使用 pip 本身安装它们:

python -m pip install setuptools
Run Code Online (Sandbox Code Playgroud)

现在它已准备好用于管理我们需要的一切:

python -m pip install django
python -m pip freeze
Run Code Online (Sandbox Code Playgroud)

PS 更智能的方法是尝试在 utils/rmtree 内递归地执行 chown。