【发布时间】:2019-09-13 00:31:03
【问题描述】:
在维护 CLI 实用程序的过程中,我想添加一个 update 操作,该操作将从 PyPI 获取该软件包的最新版本并升级现有安装。
$ cli -V
1.0.23
$ cli update
// many lines of pip spam
$ cli -V
1.0.24 // or etc
这在所有系统范围内安装了 Python(C:\Python36 或类似)的机器上都可以正常工作,但是以用户身份安装 Python(C:\users\username\AppData\Local\Programs\Python\Python36)的机器在卸载旧版本时收到此错误:
Could not install packages due to an EnvironmentError: [WinError 5] Access is denied: 'C:\\Users\\username\\AppData\\Local\\Temp\\pip-uninstall-f5a7rk2y\\cli.exe'
Consider using the `--user` option or check the permissions.
我曾假设这是因为当 pip 尝试删除它时,错误文本中调用的 cli.exe 当前正在运行,但是这里的路径不是该 exe 所在的 %LOCALAPPDATA%\Programs\Python\Python36\Scripts,而是而不是%TEMP%。如何允许将文件移动到那里,但一旦存在就不能删除它?
按照错误消息的建议在安装参数中包含--user 是否不(与先前编辑此问题的指示相反)解决了问题,但是将 cli 可执行文件移到其他地方确实可以。
我希望得到这样的答案:
- 解释了无法从 TEMP 目录中删除可执行文件的根本问题,以及...
- 提供问题的解决方案,绕过权限错误,或查询此包是否以用户身份安装,以便代码可以将
--user添加到 args。
虽然这个问题相当笼统,但下面是一个 MCVE:
def update(piphost):
args = ['pip', 'install',
'--index-url', piphost,
'-U', 'cli']
subprocess.check_call(args)
update('https://mypypiserver:8001')
【问题讨论】:
标签: python permissions pip