如何从python代码调用shell脚本?
如何从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()(已弃用)或整
>>> 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变量作为参数传递?@keerthi007subprocess.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'])