我对以下代码有问题:
callBash.py:
import subprocess
print "start"
subprocess.call("sleep.sh")
print "end"
sleep.sh:
sleep 10
我希望"结束"在 10 秒后打印。 (我知道这是一个愚蠢的例子,我可以简单地在 python 中睡觉,但这个简单的 sleep.sh 文件只是作为一个测试)
使 sleep.sh 可执行文件并将shell=True
添加到参数列表中(如前面的答案所示)工作正常。根据搜索路径,您可能还需要添加./
或其他适当的路径。 (即,将"sleep.sh"
更改为"./sleep.sh"
。
bash 脚本的第一行是指向 shell 的路径,则不需要 shell=True
参数(在像 Linux 这样的 Posix 系统下);例如,#!/bin/bash
。
如果sleep.sh
具有 shebang #!/bin/sh
并且具有适当的文件权限 - 运行chmod u+rx sleep.sh
以确保它处于$PATH
中,那么您的代码应该按原样工作:
import subprocess
rc = subprocess.call("sleep.sh")
如果脚本不在 PATH 中,则指定它的完整路径,例如,如果它在当前工作目录中:
from subprocess import call
rc = call("./sleep.sh")
如果脚本没有 shebang,则需要指定shell=True
:
rc = call("./sleep.sh", shell=True)
如果脚本没有可执行权限并且您无法更改它,例如,通过运行os.chmod('sleep.sh', 0o755)
那么您可以将脚本读取为文本文件并将字符串传递给subprocess
模块:
with open('sleep.sh', 'rb') as file:
script = file.read()
rc = call(script, shell=True)
如果有人寻找调用带参数的脚本
import subprocess
val = subprocess.check_call("./script.sh '%s'" % arg, shell=True)
请记住在传递之前使用 str(arg) 将参数转换为字符串。
这可用于传递任意数量的参数:
subprocess.check_call("./script.ksh %s %s %s" % (arg1, str(arg2), arg3), shell=True)
实际上,您只需要添加shell=True
参数:
subprocess.call("sleep.sh", shell=True)
但要小心——
警告 如果与不受信任的输入结合使用,使用 shell=True 调用系统 shell 可能会带来安全隐患。有关详细信息,请参阅"常用参数"下的警告。
源
确保sleep.sh
具有执行权限,并使用shell=True
运行它:
#!/usr/bin/python
import subprocess
print "start"
subprocess.call("./sleep.sh", shell=True)
print "end"
chmod
不起作用,那么您也可以尝试:
import os
os.system('sh script.sh')
# you can also use bash instead of sh
添加一个答案,因为我在询问如何从 python 运行 bash 脚本后被引导到这里。如果脚本采用参数,OSError: [Errno 2] file not found
会收到错误。例如,假设您的脚本采用了一个睡眠时间参数:subprocess.call("sleep.sh 10")
不起作用,则必须将其作为数组传递:subprocess.call(["sleep.sh", 10])