在python中运行bash脚本
我对以下代码有问题: callBash.py:在python中运行bash脚本,python,bash,call,Python,Bash,Call,我对以下代码有问题: callBash.py: import subprocess print "start" subprocess.call("sleep.sh") print "end" sleep 10 睡眠。sh: import subprocess print "start" subprocess.call("sleep.sh") print "end" sleep 10 我想在10秒后打印“结束”。(我知道这是一个愚蠢的例子,我可以简单地在python中休眠,但这个简单的sl
import subprocess
print "start"
subprocess.call("sleep.sh")
print "end"
sleep 10
睡眠。sh:
import subprocess
print "start"
subprocess.call("sleep.sh")
print "end"
sleep 10
我想在10秒后打印“结束”。(我知道这是一个愚蠢的例子,我可以简单地在python中休眠,但这个简单的sleep.sh文件只是一个测试)确保
sleep.sh
具有执行权限,并使用shell=True
运行它:
#!/usr/bin/python
import subprocess
print "start"
subprocess.call("./sleep.sh", shell=True)
print "end"
rc = call("./sleep.sh", shell=True)
实际上,您只需添加
shell=True
参数:
subprocess.call("sleep.sh", shell=True)
但要小心-
警告如果与不受信任的输入相结合,调用shell=True的系统shell可能会带来安全隐患。有关详细信息,请参阅“常用参数”下的警告
使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")
如果脚本不在路径中,则指定脚本的完整路径,例如,如果脚本在当前工作目录中:
from subprocess import call
rc = call("./sleep.sh")
如果脚本没有shebang,则需要指定shell=True
:
#!/usr/bin/python
import subprocess
print "start"
subprocess.call("./sleep.sh", shell=True)
print "end"
rc = call("./sleep.sh", shell=True)
如果脚本没有可执行权限,并且您无法更改它,例如,通过运行os.chmod('sleep.sh',0o755)
,则您可以将脚本作为文本文件读取,并将字符串传递给子流程
模块:
with open('sleep.sh', 'rb') as file:
script = file.read()
rc = call(script, shell=True)
添加一个答案,因为我是在询问如何从python运行bash脚本之后被引导到这里的。如果脚本接受参数,则会收到一个错误
OSError:[Errno 2]文件未找到
。例如,假设您的脚本接受了一个睡眠时间参数: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转换为字符串
这可用于根据需要传递任意多个参数:
subprocess.check_call("./script.ksh %s %s %s" % (arg1, str(arg2), arg3), shell=True)
如果chmod不起作用,那么您也可以尝试
import os
os.system('sh script.sh')
#you can also use bash instead of sh
我的测试谢谢我也用“$!bin/bash;sleep 10”试过了;现在还不清楚这个问题是想问什么问题,但这个问题可能应该保留下来,因为它积累了一个历史性的、或多或少的好猜测作为答案。可能还会搜索您的具体错误,和/或阅读相关问题,如我错过的shell=True。你能解释一下,为什么设置#是不够的吗!sh scricpt第一行中的bin/bash?
中的错误!bin/bash
是一个缺少的/
<代码>#/bin/bash的工作原理与我在回答中提到的一样。如果sleep.sh
不在路径中,它将不起作用。如果它在路径中并且具有正确的shebang,那么您不需要shell=True
。请参阅os.system
文档,该文档特别建议避免使用subprocess
(现在,subprocess.run()
)。如果你不能让子进程
正常工作,你很可能在os.system()
上也会遇到麻烦。你必须理解,但是的,通常避免它是你最好的选择。我建议使用列表作为参数,比如子进程。检查调用([“/script.ksh”,arg1,arg2,arg3],shell=True)
这对我来说似乎更清楚,您不需要关心格式。