簡體   English   中英

Python subprocess.call()顯然不適用於psexec

[英]Python subprocess.call() apparently not working with psexec

我在使用subprocess.call()和psexec執行遠程進程時遇到問題。 我正在使用以下語法通過subprocess.call()遠程執行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

有什么想法為什么這行不通嗎? 如果很重要,則可以通過兩個或三個主機列表上的multiprocessing的map()函數來調用execute函數。

任何幫助將是巨大的! 謝謝!

主機名前面的\\\\雙斜杠只是一個斜杠; 它加倍以逃避斜線。

您可以在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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM