从python中运行bash脚本

use*_*145 85 python bash call

我有以下代码的问题:

callBash.py:

import subprocess
print "start"
subprocess.call("sleep.sh")
print "end"
Run Code Online (Sandbox Code Playgroud)

sleep.sh:

sleep 10
Run Code Online (Sandbox Code Playgroud)

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

Jam*_*at7 78

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

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

  • 不需要提及"shell = True"的+1. (11认同)

jfs*_*jfs 34

如果sleep.sh有shebang #!/bin/sh并且它具有适当的文件权限 - 运行chmod u+rx sleep.sh以确保它在那里$PATH你的代码应该按原样运行:

import subprocess

rc = subprocess.call("sleep.sh")
Run Code Online (Sandbox Code Playgroud)

如果脚本不在PATH中,则指定它的完整路径,例如,如果它在当前工作目录中:

from subprocess import call

rc = call("./sleep.sh")
Run Code Online (Sandbox Code Playgroud)

如果脚本没有shebang,那么你需要指定shell=True:

rc = call("./sleep.sh", shell=True)
Run Code Online (Sandbox Code Playgroud)

如果脚本没有可执行权限并且您无法更改它,例如,通过运行,os.chmod('sleep.sh', 0o755)您可以将脚本作为文本文件读取并将字符串传递给subprocess模块:

with open('sleep.sh', 'rb') as file:
    script = file.read()
rc = call(script, shell=True)
Run Code Online (Sandbox Code Playgroud)


zen*_*poy 30

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

subprocess.call("sleep.sh", shell=True)
Run Code Online (Sandbox Code Playgroud)

但要注意 -

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

资源


Ada*_*tan 9

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

#!/usr/bin/python

import subprocess
print "start"
subprocess.call("./sleep.sh", shell=True)
print "end"
Run Code Online (Sandbox Code Playgroud)

  • `#!bin/bash`中的错误是缺少`/`.`#!/ bin/bash`正如我在回答中所说的那样起作用. (2认同)

Pon*_* VN 8

如果有人在寻找带参数的脚本

import subprocess

val = subprocess.check_call("./script.sh '%s'" % arg,   shell=True)
Run Code Online (Sandbox Code Playgroud)

记得在传递之前使用str(arg)将args转换为字符串.

这可用于传递所需数量的参数

subprocess.check_call("./script.ksh %s %s %s" % (agr1, str(arg2), arg3),   shell=True)
Run Code Online (Sandbox Code Playgroud)

  • 我建议使用列表作为参数,例如`subprocess.check_call(["./script.ksh", arg1, arg2, arg3], shell=True)`,这对我来说似乎更清晰,并且您不需要关心格式。 (3认同)

Har*_*992 7

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

import os
os.system('sh script.sh')
#you can also use bash instead of sh
Run Code Online (Sandbox Code Playgroud)

由我测试谢谢

  • “os.system”文档特别建议避免使用“subprocess”(现在是“subprocess.run()”)。如果你无法让 `subprocess` 工作,那么你很可能也会在使用 `os.system()` 时遇到麻烦。 (3认同)