在python中运行bash脚本

在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

我对以下代码有问题:

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中休眠,但这个简单的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)
这对我来说似乎更清楚,您不需要关心格式。