在MyCWD
内运行的命令(变量捕获工作目录):
vagrant ssh -c "cd /Path/To/Dir && ./my-shell-script.sh -d argD -f argF"
我尝试这样做但没有奏效:
vagrantCmd = ['vagrant','ssh','-c',
'cd', '/Path/To/Dir', '&&',
'./my-shell-script.sh', '-d', '-argD', '-f', 'argF']
output,error = subprocess.Popen(command, universal_newlines=True,
stdout=subprocess.PIPE, stderr=subprocess.PIPE, cwd=MyCWD).communicate()
但是,如果我这样做,它就可以了:
argCmd = ['cd', '/Path/To/Dir', '&&',
'./my-shell-script.sh', '-d', '-argD', '-f', 'argF']
os.chdir(MyCWD)
os.system('vagrant ssh -c "%s"' % ' '.join(argCmd))
后者似乎很容易 ,但不再推荐使用os.system
。我怎样才能使用subprocess.Popen()
?
我根据某些设置构建了数组(argCmd
)。基本上我构建了这样的数组,然后尝试将它们传递给subprocess.Popen
但是这样奇怪的字符串构建总是让我对那个模块感到头疼,但对于os.system
来说却相当微不足道。你如何有效地使用字符串和subprocess
?
答案 0 :(得分:2)
您使用Python代码做什么:
vagrant ssh -c cd /Path/To/Dir && ./my-shell-script.sh -d argD -f argF
你需要什么:
vagrant ssh -c "cd /Path/To/Dir && ./my-shell-script.sh -d argD -f argF"
如何解决?
vagrantCmd = ['vagrant','ssh','-c',
' '.join(['cd', '/Path/To/Dir', '&&',
'./my-shell-script.sh', '-d', '-argD', '-f', 'argF'])]
答案 1 :(得分:0)
我会尝试这样的事情:
ok = ['vagrant', 'ssh', '-c']
v = '"{}"'.format
sub = 'cd /Path/To/Dir && ./my-shell-script.sh -d -argD -f argF'
ok.append(v(pipes.quote(sub)))
和
subprocess.Popen(ok)
请参阅:
...基本上逃脱的逃脱包装。也许装饰师?或类似的东西。