我对以下代码有问题:
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
shell=True
#!/usr/bin/python import subprocess print "start" subprocess.call("./sleep.sh", shell=True) print "end"
实际上,你只需要加上 shell=True的参数:
subprocess.call("sleep.sh", shell=True)
但是要小心
警告使用 shell = True 调用系统 shell 如果与不受信任的输入组合在一起,可能会造成安全风险。有关详细信息,请参阅“常用参数”下的警告。
来源
使 sleep. sh 成为可执行文件并将 shell=True添加到参数列表(如前面的答案所示)就可以了。根据搜索路径的不同,您可能还需要添加 ./或其他适当的路径。(即,将 "sleep.sh"改为 "./sleep.sh")
./
"sleep.sh"
"./sleep.sh"
如果 bash 脚本的第一行是 shell 的路径,则不需要 shell=True参数(在类似 Linux 的 Posix 系统下) ; 例如,#!/bin/bash。
#!/bin/bash
如果 sleep.sh具有 shebang #!/bin/sh并且它具有适当的文件权限——运行 chmod u+rx sleep.sh以确保它在 $PATH中,那么您的代码应该按以下方式工作:
#!/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模块:
os.chmod('sleep.sh', 0o755)
subprocess
with open('sleep.sh', 'rb') as file: script = file.read() rc = call(script, shell=True)
添加一个答案,因为我是在询问如何从 python 运行 bash 脚本后被引导到这里的。如果脚本接受参数,则会收到错误 OSError: [Errno 2] file not found。例如,您的脚本在睡眠时间参数: subprocess.call("sleep.sh 10")将不工作,您必须传递它作为一个数组: subprocess.call(["sleep.sh", 10])
OSError: [Errno 2] file not found
subprocess.call("sleep.sh 10")
subprocess.call(["sleep.sh", 10])
如果有人在找 用参数调用脚本
import subprocess val = subprocess.check_call("./script.sh '%s'" % arg, shell=True)
请记住在传递之前使用 str (arg)将 args 转换为 string。
这可以用来传递所需的任意多个参数:
subprocess.check_call("./script.ksh %s %s %s" % (arg1, str(arg2), arg3), shell=True)
如果 chmod不起作用,你也可以试试:
chmod
import os os.system('sh script.sh') # you can also use bash instead of sh