如何使用Python的子进程模块格式化命令参数本身是一组命令?

时间:2017-06-13 20:24:43

标签: python python-2.7 subprocess popen

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

2 个答案:

答案 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)

请参阅:

...基本上逃脱的逃脱包装。也许装饰师?或类似的东西。