首页 > 解决方案 > 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。我已经仔细检查了所有这些目录的权限并且我拥有它们。以下是我迄今为止尝试过的一些事情:

  1. 在 Windows 文件浏览器中执行相同的移动。-> 它有效。
  2. 在 python3 shell 中使用脚本提供的相同参数运行相同的 os.renames 命令。-> 它的工作原理,令人困惑。
  3. 如果失败,将 os.renames 命令放入循环中重试 100 次(我在某处读到它有时会有所帮助)。-> 它失败了。
  4. 在提升的 PowerShell 中运行脚本。-> 它失败了。
  5. 用大锤敲打我的笔记本电脑。-> 还没试过。

我要提到的另一件事是脚本甚至在几天前还可以使用。在此期间我确实进行了一些编辑,但它们与这部分代码无关。

我对这个没有想法。因此,您可以提供的任何帮助将不胜感激。

标签: python-3.xscriptingwindows-10

解决方案


事实证明,问题是我对脚本所做的更改的副作用。我使用 python 在脚本前面的同一台远程计算机上启动 psexec 命令(在本地运行 taskkill 以便我正在更新的软件可以正常退出),并且我使用了 -u 标志,它更改了使用该命令的用户在远程机器上运行。当我删除 -u 标志 os.renames 再次开始工作。所以我猜想以某种方式运行 psexec 改变了 python 脚本在运行 os.renames 时使用的用户。


推荐阅读