如何从python代码调用shell脚本?

时间:2010-09-23 10:12:57

标签: python shell

如何从python代码调用shell脚本?

12 个答案:

答案 0 :(得分:207)

subprocess模块将帮助您解决问题。

肆无忌惮的例子:

>>> import subprocess
>>> subprocess.call(['./test.sh']) # Thanks @Jim Dennis for suggesting the []
0 
>>> 

其中test.sh是一个简单的shell脚本,0是此次运行的返回值。

答案 1 :(得分:78)

有一些方法可以使用os.popen()(已弃用)或整个subprocess模块,但this approach

import os
os.system(command)

是最简单的之一。

答案 2 :(得分:35)

如果您想将一些参数传递给shell脚本,可以使用方法shlex.split()

import subprocess
import shlex
subprocess.call(shlex.split('./test.sh param1 param2'))

test.sh位于同一文件夹中:

#!/bin/sh
echo $1
echo $2
exit 0

输出:

$ python test.py 
param1
param2

答案 3 :(得分:16)

import os
import sys

假设test.sh是您想要执行的shell脚本

os.system("sh test.sh")

答案 4 :(得分:13)

使用上面提到的子进程模块。

我这样用:

subprocess.call(["notepad"])

答案 5 :(得分:12)

我正在运行python 3.5和subprocess.call([' ./ test.sh'])对我不起作用。

我给你三个解决方案取决于你想要对输出做什么。

1 - 调用脚本。您将在终端中看到输出。输出是一个数字。

import subprocess 
output = subprocess.call(['test.sh'])

2 - 调用并将执行和错误转储到字符串中。除非你打印(stdout),否则你在终端上看不到执行。 Shell = True,因为Popen的论点并不适合我。

import subprocess
from subprocess import Popen, PIPE

session = subprocess.Popen(['test.sh'], stdout=PIPE, stderr=PIPE)
stdout, stderr = session.communicate()

if stderr:
    raise Exception("Error "+str(stderr))

3 - 调用脚本并在temp_file

中转储temp.txt的echo命令
import subprocess
temp_file = open("temp.txt",'w')
subprocess.call([executable], stdout=temp_file)
with open("temp.txt",'r') as file:
    output = file.read()
print(output)

请勿忘记查看doc subprocess

答案 6 :(得分:4)

如果脚本具有多个参数

#!/usr/bin/python

import subprocess
output = subprocess.call(["./test.sh","xyz","1234"])
print output

输出将给出状态码。如果脚本成功运行,它将给出0,否则将返回非零整数。

podname=xyz  serial=1234
0

下面是test.sh shell脚本。

#!/bin/bash

podname=$1
serial=$2
echo "podname=$podname  serial=$serial"

答案 7 :(得分:2)

子流程很好但有些人可能更喜欢scriptine。 Scriptine有更多高级方法,如shell.call(args)path.rename(new_name)path.move(src,dst)。 Scriptine基于subprocess和其他人。

脚本的两个缺点:

  • 即使已经足够,目前的文档级别也会更全面。
  • 与子进程不同,默认情况下,当前未安装scriptine包。

答案 8 :(得分:2)

子进程模块是启动子进程的好模块。 您可以使用它来调用shell命令:

subprocess.call(["ls","-l"]);
#basic syntax
#subprocess.call(args, *)

您可以查看其文档here.

如果您的脚本是用.sh文件或长字符串编写的,那么您可以使用os.system模块。这很简单,很容易打电话:

import os
os.system("your command here")
# or
os.system('sh file.sh')

此命令将运行脚本一次,完成并阻塞,直到它退出。

答案 9 :(得分:1)

我知道这是一个古老的问题,但是最近我偶然发现了这个问题,并且由于Subprocess API自python 3.5以来发生了变化,最终误导了我。

执行外部脚本的新方法是使用run函数。

Import subprocess

subprocess.run(['./test.sh'])

答案 10 :(得分:0)

如果您的Shell脚本文件没有执行权限,请按照以下方式进行操作。

import subprocess
subprocess.run(['/bin/bash', './test.sh'])

答案 11 :(得分:-8)

请尝试以下代码:

Import Execute 

Execute("zbx_control.sh")