在维护CLI实用程序的过程中,我想添加一个update
操作,该操作将从PyPI获取该包的最新版本并升级现有安装。在
$ cli -V
1.0.23
$ cli update
// many lines of pip spam
$ cli -V
1.0.24 // or etc
这在系统范围内(在C:\Python36
中)安装了Python的所有计算机上都能正常工作,但是作为用户(在C:\users\username\AppData\Local\Programs\Python\Python36
)安装了Python的计算机在卸载旧版本时会收到以下错误:
我假设这是因为当pip试图删除错误文本中调用的cli.exe
当前正在运行,但是这里的路径不是指向该exe所在的%LOCALAPPDATA%\Programs\Python\Python36\Scripts
,而是%TEMP%
。如何允许将文件移到那里,但不在文件到达后将其删除?在
按照错误消息的建议,将--user
包含在安装参数中并不能解决问题(与前面编辑的问题相反),但将cli
可执行文件移到别处可以解决问题。在
我希望答案是:
--user
添加到参数中。在虽然问题相当普遍,但MCVE如下:
def update(piphost):
args = ['pip', 'install',
'--index-url', piphost,
'-U', 'cli']
subprocess.check_call(args)
update('https://mypypiserver:8001')
正如最初猜测的那样,这里的问题是试图删除正在运行的可执行文件。Windows不喜欢这种胡说八道,当你尝试的时候会抛出
PermissionErrors
。但奇怪的是,您绝对可以重命名一个正在运行的可执行文件,实际上有几个questionsfromdifferenttags使用这个事实来允许对正在运行的可执行文件进行明显的更改。在这也解释了为什么可执行文件似乎是从
%LOCALAPPDATA%\Programs\Python\Python36\Scripts
运行的,但未能从%TEMP%
中删除。{pip>在执行过程中试图删除非法的文件夹(pip3)。在实施过程如下:
Path(sys.argv[0]).with_suffix('.exe')
)pip install
更新包相关问题 更多 >
编程相关推荐