- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个一直用于 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
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
反而。它完全等效但使用了更高级的语言特性(因此更难通俗易懂地解释)但消耗的资源更少。
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/
我用 IntelliJ IDEA 2021.1 CE 在 流行!_OS 20.04 与 bash 5.0.17 . 问题造句:我将IntelliJ终端设置为/bin/bash通过 IntelliJ 设
给定如下命令: bash --shortcuts 我想显示一个快捷方式列表,就像在这个页面上一样: http://www.skorks.com/2009/09/bash-shortcuts-for-m
我有一个脚本可以操作数据、创建参数并将它们发送到第二个脚本。其中一个参数包含一个空格。 脚本1.sh: args=() args+=("A") args+=("1 2") args+=("B") .
我的脚本的“只运行一次”版本的一个非常简单的示例: ./myscript.sh var1 "var2 with spaces" var3 #!/bin/bash echo $1 #output: va
我想了解数字( double )在 bash 中是如何表示的,以及当我在 bash 中以十六进制格式打印数字时会发生什么。 根据 IEEE 754 标准,double 应由 64 位表示:52 位(1
我试图在 bash -c "..." 命令中获取 bash 脚本,但它不起作用。 如果我在 bash -c "..." 之外运行命令,它会起作用。 我需要使用 bash -c "..." 因为我想确保
如何检测我的 bash shell 中是否加载了 bash 补全包?从 bash-completion 的 2.1 版(包含在 Debian 8 中)开始,除了 BASH_COMPLETION_COM
我的 bash_profile 中有一个投影函数。现在我试图从 bash 脚本中调用这个函数,但是我得到了一个未找到的错误。如何使投影函数对 bash 脚本可见? 最佳答案 必须导出函数 export
我正在编写一个 bash 脚本,它接受许多命令行参数(可能包括空格)并通过登录 shell 将它们全部传递给程序 (/bin/some_program)。从 bash 脚本调用的登录 shell 将取
当我创建一个新的 bash 进程时,提示符默认为一个非常简单的提示符。我知道我可以编辑 .bashrc 等来更改它,但是有没有办法使用 bash 命令传递提示? 谢谢! 最佳答案 提示由 PS1、PS
好的,我希望这个问题有一定道理,但是 bash shell 和 bash 终端之间有什么区别?例子。当我第一次打开终端时,会提示我当前的目录和用户名。在终端窗口标题中显示 -bash- ,当我键入 e
我是 SBCL 的新手,我正在尝试从 bash 终端运行存储在文本文件中的 Lisp 脚本。 这是我在文件开头写的内容 http://www.sbcl.org/manual/#Running-from
我知道我们可以在 bash 中使用将十六进制转换为十进制 #!/bin/bash echo "Type a hex number" read hexNum echo $(( 16#$hexNum ))
我正在尝试在 bash 脚本中自动完成文件夹名称。如果我输入完整的文件夹名称,一切正常,但我不知道如何自动完成名称。有什么想法吗? repo() { cd ~/Desktop/_REPOS/$1 }
我想检查远程网站上的一些文件。 这里是bash命令生成计算文件md5的命令 [root]# head -n 3 zrcpathAll | awk '{print $3}' | xargs -I {}
是否有任何内置函数可以使用 bash shell 脚本从给定日期获取下周日(下周一、下周二等)?例如,2014 年 9 月 1 日之后的第一个星期日是什么时候?我预计 2014 年 9 月 7 日。
我一直在尝试根据表格重命名一些特定文件,但没有成功。它要么重命名所有文件,要么给出错误。 该目录包含数百个以长条形码命名的文件,我只想重命名包含模式 _1_ 的文件。 例子 barcode_1_bar
bash 中有没有办法用变量的内容替换文本文件中的占位符? 例如,我想发送一封电子邮件通知,如下所示: Dear Foo, Alert: blah blah blah blah blah blah
我有一个 bash 脚本,它在某些字符串上附加了一个重音字符,导致它失败,我找不到这些字符在哪里或如何进入那里。 这是一些示例输出: mv: cannot move â/tmp/myapp.zipâ
这个问题在这里已经有了答案: How do I place stdout on edit line? (1 个回答) Can a bash script prepopulate the prompt
我是一名优秀的程序员,十分优秀!