139

我对以下代码有疑问:

调用Bash.py:

import subprocess
print "start"
subprocess.call("sleep.sh")
print "end"

睡眠.sh:

sleep 10

我希望在 10 秒后打印“结束”。(我知道这是一个愚蠢的例子,我可以简单地在 python 中睡觉,但是这个简单的 sleep.sh 文件只是作为一个测试)

4

7 回答 7

108

使 sleep.sh 可执行并添加shell=True到参数列表(如先前答案中所建议的)可以正常工作。根据搜索路径,您可能还需要添加./或其他一些适当的路径。(即,更改"sleep.sh""./sleep.sh"。)

shell=True如果 bash 脚本的第一行是 shell 的路径,则不需要该参数(在 Linux 等 Posix 系统下);例如,#!/bin/bash

于 2012-12-06T14:42:00.133 回答
58

如果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)
于 2014-03-14T21:35:09.610 回答
36

实际上,您只需要添加shell=True参数:

subprocess.call("sleep.sh", shell=True)

但要注意——

警告 如果与不受信任的输入结合使用,使用 shell=True 调用系统 shell 可能会带来安全隐患。有关详细信息,请参阅常用参数下的警告。

来源

于 2012-12-06T14:35:52.480 回答
35

如果有人想调用带参数的脚本

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)
于 2018-03-12T08:22:55.027 回答
15

确保它sleep.sh具有执行权限,并使用以下命令运行它shell=True

#!/usr/bin/python

import subprocess
print "start"
subprocess.call("./sleep.sh", shell=True)
print "end"
于 2012-12-06T14:28:11.053 回答
13

如果 chmod 不起作用,那么您也可以尝试

import os
os.system('sh script.sh')
#you can also use bash instead of sh

由我测试谢谢

于 2018-04-06T05:40:56.450 回答
3

添加一个答案是因为我在询问如何从 python 运行 bash 脚本后被引导到这里。OSError: [Errno 2] file not found如果您的脚本接受参数,您会收到错误消息。例如,您的脚本接受了睡眠时间参数:subprocess.call("sleep.sh 10")将不起作用,您必须将其作为数组传递:subprocess.call(["sleep.sh", 10])

于 2016-11-08T16:04:19.043 回答