【问题标题】:Python subprocess.call() apparently not working with psexecPython subprocess.call() 显然不能与 psexec 一起使用
【发布时间】:2023-03-06 11:16:01
【问题描述】:

我在使用 subprocess.call() 和 psexec 执行远程进程时遇到问题。我正在使用以下语法通过subprocess.call() 远程执行进程:

def execute(hosts):
    ''' Using psexec, execute the script on the list of hosts '''
    successes = []

    wd = r'c:\\'
    file = r'c:\\script.exe'
    for host in hosts:
        res = subprocess.call(shlex.split(r'psexec \\%s -e -s -d -w %s %s ' % (host,wd,file)), stdin=None, stdout=None, stderr=None)
        if res == 0:
           successes.append(host)   
        else:
            logging.warning("Error executing script on host %s with error code %d" % (host, res))

    print shlex.split(r'psexec \\%s -e -s -d -w %s %s ' % (hosts[0],wd,file))
    return successes 

如您所见,作为故障排除的一部分,我正在打印shlex.split() 输出以确保它是我想要的。此打印语句给出:

['psexec', '\\HOSTNAME', '-e', '-s', '-d', '-w', 'c:\\', 'c:\\script.exe']

这是我所期望的。不幸的是,当我运行它时,我收到一条错误消息:

PsExec could not start \GN-WRK-02:
The system cannot find the file specified.

在此之后,我使用程序运行时应使用的确切语法运行 psexec 命令(根据shlex.split() 输出判断),它运行良好。我的语法是:

psexec \\HOSTNAME -e -s -d -w c:\\ c:\\script.exe

任何想法为什么这不起作用?如果重要,则通过多处理的map() 函数在两个或三个主机列表上调用执行函数。

任何帮助都会很棒!谢谢!

【问题讨论】:

    标签: python subprocess psexec


    【解决方案1】:

    您的主机名前面的\\ 双斜杠只是一个 斜杠;它被加倍以逃避斜线。

    您可以在shlex.split() 输出中看到这一点:

    ['psexec', '\\HOSTNAME', '-e, '-s', '-d', '-w', 'c:\\', 'c:\\script.exe']
    

    请注意,主机名前的\\ 只是两个反斜杠,就像在c:\\ 文件名值中一样。。如果您只打印该值,您会看到 sart 处的反斜杠只是一个字符:

    >>> print '\\HOSTNAME'
    \HOSTNAME
    >>> '\\HOSTNAME'[0]
    '\\'
    >>> '\\HOSTNAME'[1]
    'H'
    

    那是因为shlex.split() 是 POSIX 工具,而不是 Windows 工具,它也将原始字符串中的 \\ 解释为转义;如果您正在使用该工具,请再次将斜线加倍:

    shlex.split(r'psexec \\\\%s -e -s -d -w %s %s ' % (host,wd,file))
    

    一种替代方法可能是禁用 POSIX 模式,但我不完全确定这将如何与 Windows 相互作用:

    shlex.split(r'psexec \\%s -e -s -d -w %s %s ' % (host,wd,file), posix=False)
    

    【讨论】:

    • 当我打印 shlex.split(...) 时,为什么会打印双斜杠呢?我确实看到我给出的错误中只有一个斜线。希望修复如此简单!欣赏答案
    • 啊,好吧,我明白为什么它对斜线的解释不同了。我现在就试试这个。非常感谢!
    猜你喜欢
    • 2015-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-08
    • 1970-01-01
    • 1970-01-01
    • 2011-05-27
    • 2020-10-03
    相关资源
    最近更新 更多