我编写了一个 Python 脚本来执行一些 bash 脚本,如下所示:
cmd = subprocess.Popen(['bash', 'script.sh'])
这样它会执行脚本,尽管我没有使用chmod
. 我也可以在终端上写,bash script.sh
它的工作原理是一样的。我知道脚本可以通过./
像这样在它们前面加上点斜线来执行./script.sh
。
那么,我应该在我的 Python 脚本中使用哪种方式?为什么?
我编写了一个 Python 脚本来执行一些 bash 脚本,如下所示:
cmd = subprocess.Popen(['bash', 'script.sh'])
这样它会执行脚本,尽管我没有使用chmod
. 我也可以在终端上写,bash script.sh
它的工作原理是一样的。我知道脚本可以通过./
像这样在它们前面加上点斜线来执行./script.sh
。
那么,我应该在我的 Python 脚本中使用哪种方式?为什么?
首先,关于 中的点
./script.sh
,表示可以在工作目录中找到 script.sh,意思是“在此目录中查找 script.sh”。这称为点斜线,这里有很好的解释。我看到三个选项:
如果您打算将文件限制为仅在用户运行 Python 脚本时位于用户当前工作目录中时运行,请使用点斜杠。然而,这似乎不是最好的主意:大多数时候它会导致异常。
如果您打算限制您的 shell 脚本仅在它与您的 Python 脚本位于同一目录中时运行,那么您需要找出您的 Python 脚本的目录并将其作为脚本名称的前缀。
如果您打算将 shell 脚本放在 PATH 中的其他位置,请不要使用点斜线。
现在,将“bash”作为参数发送给 Popen 构造函数似乎更像是一个偏好问题。如果您不想将其作为参数发送,那么您需要在 shell 脚本中添加一个shebang
#!/bin/bash
,例如,并且您需要为其添加执行权限。这些都是完全可以接受的事情。这样做的一个好处是,如果以后更改 shell 解释器,则无需在知道有多少 Python 脚本的情况下修改对该脚本的每个调用。
并且可以像这样调用脚本:
笔记:
即使您的脚本在没有 shebang 的情况下正常运行(在这种情况下,它几乎肯定会在基于 Debian 的发行版上由破折号而不是由 bash执行),当像这样从 python 调用它时,它也会失败并引发一个带有 errno 8 的 OSError 异常( errno.ENOEXEC)。
如果确实有必要,请使用 Popen。