Python Fabric CD 上下文管理器无法从 Linux 到 Windows 工作



我有一个结构任务,我需要在远程Windows机器上运行一些命令。在此任务中,我需要更改远程计算机上的当前工作目录cd并且我正在使用上下文管理器来执行此操作。从 Windows 机器运行结构脚本时,这工作正常,但是当我从 Linux/Mac 机器运行时,我收到以下错误:

The system cannot find the path specified.
Fatal error: run() received nonzero return code 1 while executing!

这是我的结构脚本:

from fabric.api import run, env, cd
env.user = 'abc'
env.password = 'xyz'
env.shell = 'cmd.exe /c'
def task1():
    with cd('C:\temp\test'):
        run('dir')

我在这里缺少什么,如何让它从 Linux 工作?

查看Fabric's源代码,以下是cd的实现:

def cd(path):
    return _change_cwd('cwd', path)
def _change_cwd(which, path):
    path = path.replace(' ', ' ')
    if state.env.get(which) and not path.startswith('/') and not path.startswith('~'):
       new_cwd = state.env.get(which) + '/' + path
    else:
        new_cwd = path
    return _setenv({which: new_cwd})

=> 新的工作目录混合了"\"和"/"字符,Windows 可能会误解这些字符。如果我没记错的话,并且您的 Windows 服务器版本足够新,那么它应该接受"/"斜杠,因此请尝试将您的上下文指令更改为cd('C:/temp/test')

如果它不起作用,那么您的 Windows 服务器的当前目录是什么?您可以通过打印env.cwd来弄清楚。也许它在另一个驱动器上,但我怀疑...

作为一个提示,这行不通吗?

from fabric.api import run, env, cd
env.user = 'abc'
env.password = 'xyz'
env.shell = 'cmd.exe /c'
def task1():
    # with cd('C:\temp\test'):
    run('cd C:\temp\test')
    run('dir')

为了对_change_cwd方法进行移动修复,此命令

import os
print(os.sep)
# '/' in unix like
# '' in windows like 

可以帮助拥有一个系统明智的目录分隔符。

最新更新