14

我想知道是否subprocess.call("if [ ! -d '{output}' ]; then mkdir -p {output}; fi",shell=True)会被不同的服务器解释shzsh代替?bash

有人对此有想法吗?

我应该怎么做才能确保它被解释bash

4

3 回答 3

31

http://docs.python.org/2/library/subprocess.html

On Unix with shell=True, the shell defaults to /bin/sh

请注意,/bin/sh 通常与不同的符号链接,例如在 ubuntu 上:

$ ls -la /bin/sh
lrwxrwxrwx 1 root root 4 Mar 29  2012 /bin/sh -> dash

您可以使用executable参数替换默认值:

... 如果 shell=True,在 Unix 上,可执行参数指定默认 /bin/sh 的替换 shell。

subprocess.call("if [ ! -d '{output}' ]; then mkdir -p {output}; fi",
                shell=True,
                executable="/bin/bash")
于 2013-03-16T12:49:25.360 回答
4

要指定外壳程序,请使用可执行参数shell=True

如果 shell=True,在 Unix 上可执行参数指定默认 /bin/sh 的替换 shell。

In [26]: subprocess.call("if [ ! -d '{output}' ]; then mkdir -p {output}; fi", shell=True, executable='/bin/bash')
Out[26]: 0

显然,使用 executable 参数更简洁,但也可以从 sh 调用 bash:

In [27]: subprocess.call('''bash -c "if [ ! -d '{output}' ]; then mkdir -p {output}; fi"''', shell=True)
Out[27]: 0
于 2013-03-16T12:50:30.607 回答
3

您可以显式调用您选择的 shell,但对于您发布的示例代码,这不是最好的方法。相反,只需直接用 Python 编写代码。请参见此处:Python 中的 mkdir -p 功能

于 2013-03-16T12:49:47.267 回答