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