【问题标题】:Can't execute msg (and other) Windows commands via subprocess无法通过子进程执行 msg(和其他)Windows 命令
【发布时间】:2018-11-12 02:15:55
【问题描述】:

我在使用subprocess.call()subprocess.run()subprocess.Popen()os.system()(以及其他运行命令提示符命令的函数)时遇到了一些问题,因为我似乎无法使用 msg 命令工作。

import subprocess
subprocess.call("msg * Hey",shell=True)

理论上,不幸的是,这应该向网络上的每台计算机发送“嘿”,这根本没有运行,我不太清楚为什么。我可以在cmd 上成功运行它,但不能让它在 Python 中运行。

我很想听听为什么这不起作用,并希望找到一种方法来修复我的代码或替代解决方案。

编辑:已解决,感谢大家的帮助。升级到 64 位 Python 就成功了。

【问题讨论】:

  • msg * 向指定服务器(默认情况下,您发出命令的计算机)上的每个会话发送消息,而不是向网络上的每台计算机发送消息。如果您希望它向网络上的每台计算机发送消息,那可能就是它没有发送消息的原因。
  • @ErykSun:你应该发表你的评论作为答案——为我解决了这个问题。

标签: python windows python-3.x subprocess


【解决方案1】:

在 64 位 Windows 中,“msg.exe”仅作为本机 64 位二进制文​​件分发。如果您使用的是在 WOW64 仿真下执行的 32 位 Python,则找不到此文件。 WOW64 将“System32”访问重定向到“SysWOW64”目录。在 Windows 7+ 中,使用虚拟“SysNative”目录访问真实的“System32”。例如:

sysroot = os.environ['SystemRoot']
sysnative = os.path.join(sysroot, 'SysNative')
if not os.path.exists(sysnative):
    sysnative = os.path.join(sysroot, 'System32')

msgexe_path = os.path.join(sysnative, 'msg.exe')
subprocess.call([msgexe_path, '*', 'Hey'])

注意msg.exe与CMD无关,所以没有理由使用shell=True

【讨论】:

    【解决方案2】:

    尝试将其作为单独的参数调用:

    subprocess.call(['msg', '*', 'Hey'], shell=True)
    

    【讨论】:

    • 虽然在更高版本的 Python 中使用 shell=True 传递参数列表是合法的,但它通过尝试猜测如何重新组装您可能想要的字符串来工作,所以您不妨只使用该字符串而不是试图猜测它如何猜测并计算出一个列表,该列表将内置到您想要的字符串中。
    • @abarnert,使用shell=True 传递列表在POSIX 中几乎总是错误的,因为它将参数传递给shell 而不是程序,例如call(['/bin/echo \$0=$0 \$1=$1', 'a', 'b'], shell=True)。在 Windows 中这是错误的,因为 subprocess.list2cmdline 是为 CommandLineToArgvW 和 VC++ argv 解析而编写的,而不是 CMD shell 的语法。为了跨平台代码,请使用带有shell=False 的列表。 Windows 中的大多数程序都遵循 VC++ 规则,因此它通常应该可以工作。
    【解决方案3】:

    尝试将msg 命令的完整路径。所列示例

    import subprocess
    subprocess.call("/usr/local/bin/msg * Hey",shell=True)
    

    【讨论】:

      猜你喜欢
      • 2013-10-06
      • 1970-01-01
      • 2019-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多