我有一个结构任务,我需要在远程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
可以帮助拥有一个系统明智的目录分隔符。