【问题标题】:Using subprocess.Popen() so that child process starts in a compatibility mode on windows使用 subprocess.Popen() 使子进程在 Windows 上以兼容模式启动
【发布时间】:2017-11-12 10:27:41
【问题描述】:

我有一个必须通过管道与之通信的进程。它在 Windows 10 上的 Windows XP SP3 兼容模式下正常工作,但在其他模式下不能正常工作。

但似乎 subprocess 并不关心兼容模式,即使使用 shell=True 也是如此。我认为如果 shell 启动它而不是根据请求直接进入内核,那么 CM 会被保留,但事实并非如此。从 cmd.exe 启动时,它按预期在 XP 兼容模式下工作。

如何强制子进程以兼容模式启动它?还是使用 shell=True 并添加了一些特殊的环境变量的问题?

该进程是 Cygwin 的 ssh.exe,在 Windows 10 上打开关键权限存在很大问题。在 XP CM 中使用它会欺骗它忽略 ACL,否则会进入 posix 版本的权限模式。问题是我不能指望用户为他们通过属性添加的每个键设置正确的权限,并且在程序中自动执行此操作很复杂,因为程序可能没有权限这样做。这是一个大混乱。任何想法都表示赞赏。

【问题讨论】:

  • 一种解决方案是使用 Microsoft 应用程序兼容性工具包创建明确的兼容性修复程序(.sdb 文件),然后将修复程序与您的程序一起安装。这可能比使用注册表项更灵活一些。
  • ...您使用的是 32 位版本的 Python 吗?可能值得明确选择 cmd.exe 的 64 位版本,即 c:\windows\sysnative\cmd.exe /c myapp.exe,看看是否有什么不同。

标签: python windows subprocess compatibility-mode


【解决方案1】:

你可以在调用ssh.exe之前尝试设置__COMPAT_LAYER

import os
import subprocess

os.environ.update({"__COMPAT_LAYER": "WinXP"})  # set it to WinXP

your_process = proc = subprocess.Popen(["ssh", "whatever"], shell=True, env=os.environ)
# ...

【讨论】:

  • 为什么不只是os.environ["__COMPAT_LAYER"] = "WinXP"
  • @phd - 没有特别的原因,只是偏好问题,我通常设置多个环境变量,所以这是一种反射。
  • 不起作用。操作系统似乎设置了 __COMPAT_LAYER 来告诉您的应用程序它确实在兼容模式下运行。这样您的应用程序就可以在需要时对其进行操作。但是无论如何,+1 是一个很好的尝试。
  • @Dalen - 你是如何部署你的应用程序的?你可以做一个注册表项来强制ssh.exe 在兼容模式下运行,但它至少需要第一次提升执行权限。
  • 提升执行是,我想,以管理员身份运行?在属性中将 ssh.exe 的 CM 设置为 XP 后,我收到一个 OSError,抱怨没有在提升模式下运行。所以 subprocess 毕竟可能确实在 CM 中启动它。但是为什么它可以从 CMD 运行,但是在 Python 中,如果我的父进程以管理员身份运行,它仍然会要求输入密码并大喊太开放的权限,从而在 Windows 10 上冻结我的整个应用程序。
猜你喜欢
  • 2023-03-18
  • 2011-01-09
  • 1970-01-01
  • 2021-06-05
  • 1970-01-01
  • 1970-01-01
  • 2011-08-04
  • 1970-01-01
  • 2010-09-20
相关资源
最近更新 更多