gpt4 book ai didi

python - 将 bash 脚本转换为 python(小脚本)

转载 作者:太空狗 更新时间:2023-10-29 18:13:35 25 4
gpt4 key购买 nike

我有一个一直用于 Linux 环境的 bash 脚本,但现在我必须在 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 脚本,或者至少给我一些提示和指导,那真的会帮助我。

真诚的

梅斯蒂卡

根据请求添加:

这是我写的但没有成功:

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()

最佳答案

回答

让我们把它分解成几个部分。尤其是你弄错的部分。 :)


作业

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

C 风格循环 → Object-oriented-style loop

for ((r = 1; r < ($runs + 1); r++)) do done

Python 中的循环不同于 C 风格的迭代。在 Python 中发生的事情是你迭代一个可迭代对象,例如一个列表。在这里,您正在尝试做一些运行 次的事情,所以您会这样做:

for r in range(runs):
#loop body here

range(runs) 等同于[0,1,...,runs-1]runs = 5的列表> 整数元素。所以你将重复主体 runs 次。在每个循环中,r 被分配到列表的下一项。因此,这与您在 Bash 中所做的完全相同。

如果您胆子大,请使用 xrange反而。它完全等效但使用了更高级的语言特性(因此更难通俗易懂地解释)但消耗的资源更少。


输出重定向→the subprocess module

“更难”的部分,如果你愿意的话:执行一个程序并获得它的输出。 Google to the rescue!显然, HitTest 门的是一个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)

不要过度子处理,包括电池

可选地,考虑一下您可以获得几乎相同的 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 绝对是正确的选择。

关于python - 将 bash 脚本转换为 python(小脚本),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2839810/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com