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


当前回答

以防脚本有多个参数

#!/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"

其他回答

有一些方法使用os.popen()(已弃用)或整个子进程模块,但这种方法

import os
os.system(command)

是最简单的方法之一。

子流程模块将帮助您解决这个问题。

显而易见的小例子:

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

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

Subprocess模块是启动子进程的好模块。 你可以使用它来调用shell命令,如下所示:

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

你可以在这里看到它的文档。

如果您的脚本是用.sh文件或长字符串编写的,那么您可以使用os。系统模块。调用它相当简单和容易:

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

该命令将运行脚本一次,直到完成,然后阻塞直到退出。

为了在python脚本中运行shell脚本,并从ubuntu中的特定路径运行它,请使用下面的方法;

import subprocess

a= subprocess.call(['./dnstest.sh'], cwd = "/home/test") 

print(a)

CWD是当前工作目录

下图将不能在Ubuntu中运行;这里我们需要删除'sh'

subprocess.call(['sh' ,'./dnstest.sh'], cwd = "/home/test")

我正在运行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.txt的echo命令转储到temp_file中

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子流程