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

如何从python代码调用shell脚本?,python,shell,Python,Shell,如何从python代码中调用shell脚本?该模块将帮助您解决此问题 明显微不足道的例子: >>> import subprocess >>> subprocess.call(['sh', './test.sh']) # Thanks @Jim Dennis for suggesting the [] 0 >>> 其中,test.sh是一个简单的shell脚本,0是它这次运行的返回值。有一些方法可以使用os.popen()(已弃用)或整

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

该模块将帮助您解决此问题

明显微不足道的例子:

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

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

有一些方法可以使用
os.popen()
(已弃用)或整个
子流程
模块,但是


是最简单的模块之一。

使用上述子流程模块

我是这样使用它的:

subprocess.call(["notepad"])

子流程很好,但有些人可能更喜欢。Scriptine有更高级的方法集,如、和。Scriptine基于和其他

scriptine的两个缺点:

  • 当前的文档级别将更全面,即使它足够了
  • 与子流程不同,默认情况下当前未安装scriptine包

请尝试以下代码:

Import Execute 

Execute("zbx_control.sh")

如果要将某些参数传递给shell脚本,可以使用以下方法:

使用同一文件夹中的
test.sh

#!/bin/sh
echo $1
echo $2
exit 0
产出:

$ python test.py 
param1
param2
假设test.sh是您想要执行的shell脚本

os.system("sh test.sh")

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

subprocess.call(["ls","-l"]);
#basic syntax
#subprocess.call(args, *)
你可以看到它的文档

如果脚本是用一些.sh文件或长字符串编写的,则可以使用os.system模块。它相当简单,很容易调用:

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

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

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

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))
我给你们三个解决方案,取决于你们想对输出做什么

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_文件中

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实例

import subprocess

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

如果您的shell脚本文件没有执行权限,请按以下方式执行

导入子流程
subprocess.run(['/bin/bash','./test.sh']))

注意:使用列表调用子流程更安全,因为它不需要通过shell传递(可能未初始化的)字符串进行解析/解释。列表中的第一项是可执行文件,所有其他项都将作为参数传递。注意:最好传递subprocess.call()一个列表,而不是字符串(有关示例和原因,请参阅下面发送给Hugo24的命令)。这将导致:OSError:[Errno 13]权限被拒绝。我的脚本不需要与sudo一起运行@Manoj GovindanWith arguments:subprocess.call(['./test.sh',param1',param2'])@alper进入放置脚本的文件夹并运行命令,
chmod+x script.sh
。注意:script.sh是脚本的占位符,请相应地替换它。python 3.5中的子流程api已更改。新的方法是.run(args)而不是call。为什么这不是投票最多的答案?不必导入模块不是更好的解决方案吗?这里一定有一些缺点吗?使用
子流程
可以管理输入/输出/错误管道。当您有许多参数时也会更好——使用
os.command()
时,您必须使用转义特殊字符创建整个命令行,使用
subprocess
有一个简单的参数列表。但是对于简单的任务,
os.command()
可能就足够了。引用该链接:
子流程模块为生成新流程和检索其结果提供了更强大的功能*使用该模块比使用此函数更可取。*
您不也必须导入sys吗?不,您不需要;尝试打开Python shell并运行此代码段。我需要一些帮助。假设example.sh文件位于Oracle云基础架构中。如何在python中调用/运行这样的example.sh文件?我需要连接到oracle云,然后,我应该使用您在这里编写的脚本。请您编写附加代码(如何连接OCI中的example.sh文件)?谢谢。注意不要将stdout=PIPE或stderr=PIPE与
子进程一起使用。调用
。如果子进程生成足够多的输出到管道以填充操作系统管道缓冲区,则子进程将阻塞,因为没有从中读取管道。这很优雅。如何将python变量作为参数传递?@keerthi007
subprocess.call(shlex.split(f)。/test.sh param1{your_python_var}param3”)
#!/bin/bash

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

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