python fabric cd context manager无法在Linux下运行

时间:2018-01-11 04:04:35

标签: python linux fabric

我有一个结构任务,我需要在远程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上运行?

2 个答案:

答案 0 :(得分:1)

查看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来解决这个问题。也许是在另一个驱动器上,但我怀疑......

答案 1 :(得分:0)

就像提示一样,这不会起作用吗?

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 

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