python-3.x - Python 3 os.renames 仅在脚本中使用时拒绝访问
问题描述
所以我用python编写了一个部署脚本,它基本上只是移动了一堆目录。我在 Windows 上工作并且脚本操作 Windows 网络共享中的文件和目录可能相关,也可能不相关。该脚本的一个要求是将旧的二进制目录移动到同一 Windows 网络共享上的备份位置,这就是我遇到问题的地方。我正在使用 os.renames 来完成这项任务。目标路径是根据 bin 目录中可执行文件的时间戳生成的。
exec_mtime = datetime.fromtimestamp(os.path.getmtime(server_exec_path))
new_dirname = os.path.basename(target_path) + '_' + exec_mtime.strftime('%Y-%m-%d_%H.%M.%S')
backup_target_dir = os.path.join(server_old_dir_path, new_dirname)
if not os.path.exists(backup_target_dir):
print("{0}: Backing up old software...".format(server))
os.renames(server_target_path, backup_target_dir)
else:
print("{0}: A backup already exists with the same version number. Skipping backup.".format(server))
至于我的变量:
target_path == "//server/share/path/to/bin"
server_exec_path == os.path.join(target_path, 'Program.exe')
server_old_dir_path == "//server/share/path/to/bin_backup"
os.renames 命令将解析为如下内容:
os.renames("//server/share/path/to/bin", "//server/share/path/to/bin_backup\\bin_2019-11-01_13.02.27")
所以,我的问题是 os.renames 总是抛出 PermissionError: [WinError 5] Access is Denied。我已经仔细检查了所有这些目录的权限并且我拥有它们。以下是我迄今为止尝试过的一些事情:
- 在 Windows 文件浏览器中执行相同的移动。-> 它有效。
- 在 python3 shell 中使用脚本提供的相同参数运行相同的 os.renames 命令。-> 它的工作原理,令人困惑。
- 如果失败,将 os.renames 命令放入循环中重试 100 次(我在某处读到它有时会有所帮助)。-> 它失败了。
- 在提升的 PowerShell 中运行脚本。-> 它失败了。
- 用大锤敲打我的笔记本电脑。-> 还没试过。
我要提到的另一件事是脚本甚至在几天前还可以使用。在此期间我确实进行了一些编辑,但它们与这部分代码无关。
我对这个没有想法。因此,您可以提供的任何帮助将不胜感激。
解决方案
事实证明,问题是我对脚本所做的更改的副作用。我使用 python 在脚本前面的同一台远程计算机上启动 psexec 命令(在本地运行 taskkill 以便我正在更新的软件可以正常退出),并且我使用了 -u 标志,它更改了使用该命令的用户在远程机器上运行。当我删除 -u 标志 os.renames 再次开始工作。所以我猜想以某种方式运行 psexec 改变了 python 脚本在运行 os.renames 时使用的用户。
推荐阅读
- c# - Visual Studio 2019 解决方案中的最大项目数量
- r - 用 r 中的每小时数据计算每日平均值
- ffmpeg - ffmpeg:如何在使用 filter select='between(t,start,stop)+between...' 进行多次 (100) 剪辑时保持音频同步
- python - 选择一个随机列表,然后从该列表中提取信息
- java - spring boot and reactjs for frontend was working fine till i add security to the backend
- firebase - 如何限制应用程序的高级功能?
- sip - 我正在开发 RTP 服务器。我没有得到我的确认。我究竟做错了什么?
- swift - 从 iOS 13 UIDatepicker 转换到 iOS 14 UIDatepicker
- sql - 如何使用来自同一表的值在表上应用 RLS
- angular - Angular 材料日期选择器在 1 天前发送日期以及如何使用 Angular 材料日期选择器的时刻