如何从python代码调用shell脚本?
子流程模块将帮助你解决这个问题。
显而易见的小例子:
>>> import subprocess >>> subprocess.call(['sh', './test.sh']) # Thanks @Jim Dennis for suggesting the [] 0 >>>
其中test.sh是一个简单的shell脚本,0是它这次运行的返回值。
test.sh
0
有一些方法可以使用os.popen()(已弃用)或整个subprocess模块,但是这种方法 . c
os.popen()
subprocess
import os os.system(command)
是最简单的方法之一。
如上所述,使用子流程模块。
我是这样使用的:
subprocess.call(["notepad"])
Subprocess很好,但有些人可能更喜欢scriptine。Scriptine有更高级的方法集,如shell.call (args), path.rename (new_name)和path.move (src, dst)。Scriptine基于子流程等。
scriptine的两个缺点:
请尝试以下代码:
Import Execute Execute("zbx_control.sh")
如果你想传递一些参数到你的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
import os import sys
假设test.sh是您想要执行的shell脚本
os.system("sh test.sh")
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 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)
别忘了看一下文档子流程
以防脚本有多个参数
#!/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"
我知道这是一个老问题,但我最近偶然发现了这个问题,它最终误导了我,因为子流程 API自python 3.5以来发生了变化。
执行外部脚本的新方法是使用run函数,该函数运行args所描述的命令。等待命令完成,然后返回一个CompletedProcess实例。
run
import subprocess subprocess.run(['./test.sh'])
如果您的shell脚本文件没有执行权限,请按照以下方法执行。
import subprocess subprocess.run(['/bin/bash', './test.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")