python脚本在Windows中运行的用户是啥? [复制]

Posted

技术标签:

【中文标题】python脚本在Windows中运行的用户是啥? [复制]【英文标题】:What user do python scripts run as in windows? [duplicate]python脚本在Windows中运行的用户是什么? [复制] 【发布时间】:2010-11-15 20:51:48 【问题描述】:

我正在尝试让 python 删除一些目录,但我在它们上出现访问错误。我认为是python用户帐户没有权限?

WindowsError: [Error 5] Access is denied: 'path'

是我运行脚本时得到的。 我试过了

shutil.rmtree  
os.remove  
os.rmdir

它们都返回相同的错误。

【问题讨论】:

那么,您使用哪个用户帐户 运行脚本?通常你应该知道,至少在你的机器上,如果你设置脚本运行...... 我只是作为我自己运行,我可以直接手动删除,所以我认为它是一个奇怪的窗口和python权限断开 尝试使用 SysInternals 的“进程监视器”运行脚本,以准确查看错误发生在哪个对象(文件、目录或其他)以及它发生在哪个进程中。“进程资源管理器”可以告诉你什么进程正在运行的凭据(也许进程监视器也可以;我不确定)。 您介意打印出您要删除的路径并在此处发布输出吗?指定路径的格式可能有问题。 【参考方案1】:

搜索几个小时后的简单解决方案是首先检查该文件夹是否真的存在!

GIT_DIR="C:/Users/...."
if os.path.exists(GIT_DIR):
    shutil.rmtree(GIT_DIR)

这对我有用。

【讨论】:

不同的是,我只是在上一行代码中创建的。所以它100%肯定存在。但是windows的OS级适配器存在访问问题。【参考方案2】:

我们在删除 Windows 上的文件和目录时遇到了问题,即使我们刚刚复制了它们,如果它们被设置为“只读”。 shutil.rmtree() 为您提供了一些异常处理程序来处理这种情况。您调用它并提供如下异常处理程序:

import errno, os, stat, shutil

def handleRemoveReadonly(func, path, exc):
  excvalue = exc[1]
  if func in (os.rmdir, os.remove) and excvalue.errno == errno.EACCES:
      os.chmod(path, stat.S_IRWXU| stat.S_IRWXG| stat.S_IRWXO) # 0777
      func(path)
  else:
      raise

shutil.rmtree(filename, ignore_errors=False, onerror=handleRemoveReadonly)

您可能想尝试一下。

【讨论】:

另见voidspace.org.uk/downloads/pathutils.py中的onerror函数 我得到:NameError: name 'stat' is not defined 编辑:要求您在脚本顶部执行“import stat”。虽然解决了我的问题。非常感谢! 我试过这个解决方案,现在我有 [Error 5] Access denied 这一行的错误:os.chmod(path, stat.S_IRWXU| stat.S_IRWXG| stat.S_IRWXO) # 0777 使用func in (os.rmdir, os.unlink, os.remove),尤其是从python 3.7开始。从 3.7 开始,我无法找到将 os.remove 传递给错误处理程序的位置。 "这个函数在语义上与remove() 相同" - python os.unlink @QuinnDirks 是的,这都是 python 2.x。检查shutil.rmtree 的相应文档,也许可以使用它。这一切都取决于shutil.rmtree 传递给错误处理程序的函数,错误处理程序是失败的(正如文档所说,它依赖于平台和实现)。也许您想在错误处理程序中打印出传递的函数,以便查看您的环境和用例中正在使用哪个函数。【参考方案3】:

@ThomasH : 又一堵墙。

在 unix 系统上,您必须确保父目录也是可写的。 这是另一个版本:

def remove_readonly(func, path, exc):
    excvalue = exc[1]
    if func in (os.rmdir, os.remove) and excvalue.errno == errno.EACCES:

        # ensure parent directory is writeable too
        pardir = os.path.abspath(os.path.join(path, os.path.pardir))
        if not os.access(pardir, os.W_OK):
            os.chmod(pardir, stat.S_IRWXU| stat.S_IRWXG| stat.S_IRWXO)

        os.chmod(path, stat.S_IRWXU| stat.S_IRWXG| stat.S_IRWXO) # 0777
        func(path)
    else:
        raise

【讨论】:

根据Python Documention,onerror 引发的异常不会被捕获,所以我不确定 raise 语句是否意味着什么。 【参考方案4】:

你是如何运行脚本的?从交互式控制台会话?如果是这样,只需打开一个 DOS 命令窗口(使用 cmd)并输入“whoami”。那就是您以交互方式运行脚本的人。

好的,我刚才看到了您的编辑...为什么不打印路径并检查属性以查看运行脚本的用户帐户是否具有所需的权限?

如果 whoami 无法在您的 Windows 版本上运行,您可以在命令窗口中使用环境变量,例如 SET USERNAME 和 SET DOMAINNAME。

【讨论】:

whoami 是一个 *nix 命令,而不是 windows。 @Max--你在 Windows 上试过了吗?它工作得很好。 我刚试过,对我不起作用 whoami 在我的工作 XP 上找不到。 我猜你安装的东西添加了 whoami 命令。【参考方案5】:

脚本没有特殊用户,它们只是在执行脚本的当前登录用户下运行。

您是否尝试过检查:

您正在尝试删除有效路径?还有那个 该路径没有锁定文件?

【讨论】:

【参考方案6】:

如果脚本作为计划任务运行(这很可能是清理脚本),它可能会作为 SYSTEM 运行。 (不明智,但是)可以对目录设置权限以使 SYSTEM 无权访问。

【讨论】:

计划任务以您告诉它运行的任何用户身份运行。不过,我认为在旧版本的 Windows 上这是不正确的。【参考方案7】:

我从未使用过 Python,但我认为它会以任何用户执行脚本的方式运行。

【讨论】:

好的,所以它显然是像我一样运行的,为什么我不能通过python删除文件,但我可以通过命令行的rmdir删除它? 你只是硬编码了路径吗?你确定这是正确的路径吗?如果您可以手动操作,我想不出它为什么不起作用的任何原因。 是的,我让它从 listdir 动态获取路径,但是当它被淹没时,我只是在 python 中放置相同的路径,设置场景并且 python 无法删除它但我如果我使用 cmd 可以 我真的不知道那可能是什么问题。我猜 Access denied 错误只是掩盖了真正的问题,除非 Python 在某种沙箱中运行类似的方法。抱歉,我没有更好的答案。

以上是关于python脚本在Windows中运行的用户是啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

从php.in windows调用python脚本

Java 和 Python 之间的 Windows 上的 IPC 保护给当前用户

在 XAMPP (WINDOWS 8.1) 中作为脚本在 PHP 中运行 Python

记录python脚本在Windows下运行成功,在Linux下运行失败

获取运行python脚本的Windows计算机的名称?

从 Windows 任务调度程序在虚拟环境中运行 python 脚本