使用Subprocess从python运行终端命令

时间:2017-09-04 09:59:22

标签: python django python-3.x django-views subprocess

我正在尝试从我的django运行终端命令,但收到错误。

这是我想要运行的命令:

kubectl apply -f <(istioctl kube-inject -f FILE_PATH)

这是我尝试过的: 来自 views.py

nodesvc = subprocess.call('kubectl apply -f <(istioctl kube-inject -f ' + os.path.join(path) + '/nodeService.yaml)',
                                      shell=True)

我正在临时目录中创建一个文件并在此处传递它的路径,这是正确的。

这是错误:

/bin/sh: -c: line 0: syntax error near unexpected token `('
/bin/sh: -c: line 0: `kubectl apply -f <(istioctl kube-inject -f /var/folders/g2/8fzl8mjj5xxfqdfvrl7v3q_40000gn/T/tmpstfcq3es/nodeService.yaml)'

我认为花括号有问题'(', 我怎么能解决这个问题,请帮帮我! 提前谢谢!

1 个答案:

答案 0 :(得分:2)

问题是无论shell调用什么shell都不支持通过<(..)进行进程替换。什么对我有用:

subprocess.call(["/bin/bash", "-c", "wc -l <(sort something.txt)"])

这会强制将shell作为bash调用,它通常支持进程替换。对于你的命令,这应该工作:

subprocess.call(["/bin/bash", "-c", 'kubectl apply -f <(istioctl kube-inject -f ' + os.path.join(path) + '/nodeService.yaml)'])

编辑:适应问题