我有一个bash脚本,我一直在用于Linux环境,但现在我必须在Windows平台上使用它,并希望将bash脚本转换为我可以运行的python脚本。
bash脚本相当简单(我认为),我试图通过谷歌转换它,但无法成功转换它。
bash脚本如下所示:
runs=5
queries=50
outfile=outputfile.txt
date >> $outfile
echo -e "\n---------------------------------"
echo -e "\n----------- Normal --------------"
echo -e "\n---------------------------------"
echo -e "\n----------- Normal --------------" >> $outfile
for ((r = 1; r < ($runs + 1); r++))
do
echo -e "Run $r of $runs\n"
db2 FLUSH PACKAGE CACHE DYNAMIC
python reads.py -r1 -pquery1.sql -q$queries -shotelspec -k6 -a5 >> $outfile
done
主命令,python read.py ...等是我给出的另一个python文件,并且有你所看到的参数。
我知道这要求很多,但是如果有人可以将其转换为我可以使用的python脚本或者至少给我一些提示和指示,那真的会帮助我。
此致
Mestika
这是我写的,但没有成功:
runs=5
queries=50
outfile=ReadsAgain.txt
file = open("results.txt", "ab")
print "\n---------------------------------"
print "\n----------- Normal --------------"
print "\n---------------------------------"
file.write("\n----------- Normal --------------\n")
print "\n------------- Query without Index --------------"
file.write("\n------------- Query without Index --------------\n")
for r = 1; r < (%s + 1); r++ % runs
print "Run %s of %s \n" % r % runs
db2 FLUSH PACKAGE CACHE DYNAMIC
output = python reads.py -r1 -pquery1.sql -q$queries -shotelspec -k6 -a5
file.write(output)
file.close()
答案 0 :(得分:32)
让我们把它分解成碎片。特别是你弄错了。 :)
outfile=ReadsAgain.txt
你需要在字符串周围添加引号应该不足为奇。另一方面,为了便于阅读,您可以在=
周围添加空格。
outfilename = "ReadsAgain.txt"
str.format
(或%
操作)python reads.py <snip/> -q$queries <snip/>
所以你知道如何进行重定向,但是如何进行变量扩展呢?您可以使用the format
method(v2.6 +):
command = "python reads.py -r1 -pquery1.sql -q{0} -shotelspec -k6 -a5".format(queries)
您也可以使用the %
operator:
#since queries is a number, use %d as a placeholder
command = "python reads.py -r1 -pquery1.sql -q%d -shotelspec -k6 -a5" % queries
for ((r = 1; r < ($runs + 1); r++)) do done
Python中的循环不同于C风格的迭代。 Python中发生的事情是迭代可迭代对象,例如列表。在这里,您正尝试runs
次做某事,所以你会这样做:
for r in range(runs):
#loop body here
range(runs)
相当于[0,1,...,runs-1]
,runs = 5
整数元素列表。所以你将重复身体runs
次。在每个角色,r
被分配列表的下一个项目。因此,这完全等同于你在Bash中所做的事情。
如果您感觉大胆,请改用xrange
。它完全等同,但使用更高级的语言功能(因此用外行的术语来解释起来比较困难),但消耗的资源更少。
subprocess
module “更强硬”部分,如果您将:执行程序并获取其输出。 Google to the rescue!显然,最重要的是一个stackoverflow问题:this one。您可以使用一个简单的函数隐藏它背后的所有复杂性:
import subprocess, shlex
def get_output_of(command):
args = shlex.split(command)
return subprocess.Popen(args,
stdout=subprocess.PIPE).communicate()[0]
# this only returns stdout
所以:
python reads.py -r1 -pquery1.sql -q$queries -shotelspec -k6 -a5 >> $outfile
变为:
command = "python reads.py -r1 -pquery1.sql -q%s -shotelspec -k6 -a5" % queries
read_result = get_output_of(command)
subprocess
,包括电池可选地,考虑您可以使用以下内容获得几乎相同的date
输出:
import time
time_now = time.strftime("%c", time.localtime()) # Sat May 15 15:42:47 2010
(请注意,缺少时区信息。如果对您来说很重要,这应该是another question的主题。)
最终结果应如下所示:
import subprocess, shlex, time
def get_output_of(command):
#... body of get_output_of
#... more functions ...
if __name__ = "__main__":
#only execute the following if you are calling this .py file directly,
#and not, say, importing it
#... initialization ...
with file("outputfile.txt", "a") as output_file: #alternative way to open files, v2.5+
#... write date and other stuff ...
for r in range(runs):
#... loop body here ...
与相对简单和简短的Bash脚本相比,这看起来非常可怕,对吗? Python不是一种专门的语言:它的目的是做好所有事情,但不是直接构建用于运行程序并获取它们的输出。
但是,你不会正常在Bash中编写数据库引擎,对吗?它是适用于不同工作的不同工具。在这里,除非你打算做一些用这种语言写一些非常重要的改动,[Ba] sh绝对是正确的选择。
答案 1 :(得分:7)
移植程序应该相当简单。唯一棘手的部分是运行db2命令和(可能)重构reads.py,以便可以将其作为库函数调用。
基本理念是一样的:
echo
替换为print
。for r in range(runs):
替换你的循环。date
。db2
模块的调用替换为import reads.py
。但是,正如马塞洛所说,如果你想要更多的帮助 - 你最好自己付出一些努力直接提问。
答案 2 :(得分:1)
尽管我赞成用Python而不是bash编写,如果将它转换为Python的唯一原因是你可以在Windows上运行它,请记住你可以在Windows上安装bash并运行它原样。 Cygwin.com完全实现了许多Unix命令。