如何从Python代码中调用一个Shell脚本?
subprocess模块将为您提供帮助。
显然微不足道的示例:
>>> import subprocess
>>> subprocess.call(['sh', './test.sh']) # Thanks @Jim Dennis for suggesting the []
0
>>>
当test.sh
是一个简单的shell脚本时,0
是它这次运行的返回值。
subprocess
可以管理输入/输出/错误管道。当您有多个参数时,使用 os.command()
需要创建整个命令行并转义特殊字符,而使用 subprocess
则只需要一个简单的参数列表。但对于简单任务,os.command()
可能已经足够了。 - Michał Niklassubprocess
模块提供了更强大的功能,可以生成新进程并检索其结果;使用该模块比使用此函数更可取。 - Maximilian如果您想将一些参数传递给您的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
subprocess.call(shlex.split(f"./test.sh param1 {your_python_var} param3"))
- TDkimport os
import sys
假设test.sh是您要执行的Shell脚本。os.system("sh test.sh")
我正在运行Python 3.5,但subprocess.call(['./test.sh'])对我无效。
我根据输出的用途给你三个解决方案。
1 - 调用脚本。你将在终端看到输出,输出是一个数字。
import subprocess
output = subprocess.call(['test.sh'])
2-调用并将执行过程和错误信息输出到字符串中。如果没有打印(stdout),你看不到执行过程在终端中的输出。在Popen中使用Shell=True参数对我无效。
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)
别忘了查看subprocess文档
subprocess.call
中使用stdout=PIPE或stderr=PIPE。如果子进程生成足够的输出以填满操作系统管道缓冲区,则该子进程将被阻塞,因为这些管道没有被读取。 - user9652688subprocess.call(["notepad"])
我知道这是一个老问题,但最近我偶然发现它并导致我产生了误导,因为自从Python 3.5以来,Subprocess API已经发生了变化。
执行外部脚本的新方法是使用 run
函数,该函数运行由参数描述的命令。等待命令完成,然后返回一个 CompletedProcess 实例。
import subprocess
subprocess.run(['./test.sh'])
#!/usr/bin/python
import subprocess
output = subprocess.call(["./test.sh","xyz","1234"])
print output
输出将给出状态码。如果脚本成功运行,它将返回0,否则返回非零整数。
podname=xyz serial=1234
0
#!/bin/bash
podname=$1
serial=$2
echo "podname=$podname serial=$serial"
Subprocess模块是启动子进程的好方法。您可以像这样使用它调用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')
如果您的Shell脚本文件没有执行权限,请按以下方式进行操作。
import subprocess
subprocess.run(['/bin/bash', './test.sh'])
chmod +x script.sh
。注意:script.sh 是您脚本的占位符,请相应地进行替换。 - Tom J Muthirenthi