В ходе обслуживания утилиты 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.
Я предполагал, что это связано с тем, что cli.exe
, вызванный в тексте ошибки, в данный момент выполняется, когда pip пытается его удалить, однако путь здесь не к %LOCALAPPDATA%\Programs\Python\Python36\Scripts
, где живет этот exe, но вместо %TEMP%
. Как можно переместить файл туда, но не удалить его, когда он там будет?
, включая --user
в установочных аргументах, как рекомендовано в сообщении об ошибке, не (вопреки указанию на более раннее редактирование этого вопроса) решает проблему, но перемещается cli
исполняемый файл в другом месте делает.
Я надеюсь получить ответ, который:
- Объясняет причину неудачной попытки удалить исполняемый файл из каталога TEMP и ...
- Предоставляет решение этой проблемы, чтобы обойти ошибку разрешений или запросить, установлен ли этот пакет как пользователь, чтобы код мог добавить
--user
к аргументам.
Хотя вопрос довольно общий, MCVE ниже:
def update(piphost):
args = ['pip', 'install',
'--index-url', piphost,
'-U', 'cli']
subprocess.check_call(args)
update('https://mypypiserver:8001')