如何创建一个Python脚本以创建多个bash脚本?
如何创建一个Python脚本以创建多个bash脚本?
我有一个名为list.txt的文件,其中是一些文件名的列表:
input1.txt input2.txt input3.txt
我想要创建一个Python脚本,为每个文件名创建一个文件。更具体地说,我需要它打印一些文本,将文件名加入其中,并将其保存为一个唯一的.sh文件。我的脚本如下所示:
import os os.chdir("/Users/user/Desktop/Folder") with open('list2.txt','r') as f: lines = f.read().split(' ') for l in lines: print "#!/bin/bash\n#BSUB -J",l+".sh","\n#BSUB -o /scratch/DBC/user/"+l+".sh.out\n#BSUB -e /scratch/DBC/user/"+l+".sh.err\n#BSUB -n 1\n#BSUB -q normal\n#BSUB -P DBCDOBZAK\n#BSUB -W 168:00\n" print "cd /scratch/DBC/user\n" print 'grep "input"',l+" > result."+l+".txt" with open('script{}.sh'.format(l), 'w') as output: output.write(l)
我有一些问题:
- 输出文件只包含文件名,没有我打印的内容。
清楚地说,我的输出文件(应该有3个)应该是这样的:
#!/bin/bash #BSUB -J input3.sh #BSUB -o /scratch/DBC/user/input1.sh.out #BSUB -e /scratch/DBC/user/input3.sh.err #BSUB -n 1 #BSUB -q normal #BSUB -P DBCDOBZAK #BSUB -W 168:00 cd /scratch/DBC/user grep "input" input3 > result.input3.txt
我现在制作了以下几乎可以工作的脚本。
import os os.chdir("/Users/user/Desktop/Folder") with open('list.txt','r') as f: lines = f.read().split('\n') for l in lines: header = "#!/bin/bash \n#BSUB -J %s.sh \n#BSUB -o /scratch/DBC/user/%s.sh.out \n#BSUB -e /scratch/DBC/user/%s.sh.err \n#BSUB -n 1 \n#BSUB -q normal \n#BSUB -P DBCDOBZAK \n#BSUB -W 168:00\n"%(l,l,l) script = "cd /scratch/DBC/user\n" script2 = 'grep "input" %s > result.%s.txt\n'%(l,l) all= "\n".join([header,script,script2]) with open('script_{}.sh'.format(l), 'w') as output: output.write(all)
我仍然有一个问题,这会创建4个脚本,而不是我预期的3个:script_input1.sh、script_input2.sh、script_input3.sh和script_sh。最后一个脚本script_sh只有打印的文本,没有"input"文本的内容。
我认为这是因为我的list.txt文件末尾有一个"\n"?然而,我查看了一下,确实没有。有没有办法解决这个问题?也许我可以使用某种长度函数?
问题的原因是第一个问题是因为代码生成的脚本文件数量多于实际的txt文件数量,作者排除了txt文件末尾可能有空格或换行符的问题后仍然感到困惑。第二个问题是作者尝试使用变量来存储文本,但是遇到了Python不允许向元组变量追加的错误。
解决方法是作者提供了一个修改后的代码,其中使用了一个变量来存储所需的文本,并通过添加适当的权限来更改脚本文件的权限。此外,作者还建议在循环遍历文件夹时,确保选择的文件名包含"input",但如果已知文件名,可以省略该行代码。
以下是整理后的文章:
问题:如何创建一个Python脚本来生成多个bash脚本?
最近有个读者在编写Python代码时遇到了一些问题,希望能够生成多个bash脚本。下面是读者的问题以及解决方法。
问题1:为什么通过代码生成的脚本文件数量多于实际的txt文件数量?
读者在代码中遍历一个文件夹,并根据文件名生成对应的bash脚本文件。然而,生成的脚本文件数量比实际的txt文件数量多了一个。读者怀疑是因为txt文件末尾可能有空格或换行符的问题,但经过排查后发现并非如此。
问题2:为什么使用变量来存储文本时会出错?
读者尝试使用一个变量来存储所需的文本,但遇到了Python不允许向元组变量追加的错误。
解决方法:
为了解决问题1,读者提供了以下修改后的代码:
import os for i, file in enumerate(os.listdir("/Users/user/Desktop/Folder")): if "input" in file: with open(file) as f: lines = f.readlines() for l in lines: data = "" data += "#!/bin/bash\n#BSUB -J",l+".sh","\n#BSUB -o /scratch/DBC/user/"+l+".sh.out\n#BSUB -e /scratch/DBC/user/"+l+".sh.err\n#BSUB -n 1\n#BSUB -q normal\n#BSUB -P DBCDOBZAK\n#BSUB -W 168:00\n" data += "cd /scratch/DBC/user\n" data += 'grep "input"'+l+" > result."+l+".txt" with open('script%s.sh'%i, 'w') as output: output.write(data) os.chmod("script%s.sh'%i", 700)
读者还建议在循环遍历文件夹时,可以添加条件判断语句`if "input" in file`来选择包含"input"的文件名。但如果已知文件名,可以省略该行代码。
至于问题2,读者建议检查代码中的变量是否为元组类型,因为Python不允许向元组变量追加。如果是元组类型,可以考虑改为使用列表类型。
通过以上解决方法,读者可以成功创建一个Python脚本来生成多个bash脚本文件。在代码编写过程中,读者注意到了问题1和问题2,并通过适当的修改解决了这些问题。希望这篇文章对有类似问题的读者有所帮助!
问题的出现原因:需要创建多个bash脚本,每个脚本都有相同的内容,只是输入参数不同。
解决方法:创建一个Python脚本,用于生成多个bash脚本,并运行这些脚本。
在解决某个问题时,我们可能需要创建多个bash脚本,这些脚本的内容基本相同,只是输入参数不同。一种解决方法是分别创建多个脚本文件,分别命名为script1.sh、script2.sh、script3.sh等等。但这种方法会导致文件数量过多,不便于管理。
另一种解决方法是创建一个名为script.sh的bash文件,通过传递不同的输入参数来执行不同的操作。以下是一个示例的script.sh文件的内容:
#!/bin/bash #BSUB -J "$1".sh #BSUB -o /scratch/DBC/user/"$1".sh.out #BSUB -e /scratch/DBC/user/"$1".sh.err #BSUB -n 1 #BSUB -q normal #BSUB -P DBCDOBZAK #BSUB -W 168:00 cd /scratch/DBC/user grep "input" "$1" > result."$1".txt
在这个脚本中,通过使用"$1"作为参数,可以根据传递的不同输入参数执行不同的操作。例如,可以通过以下命令来运行这个脚本:
script.sh input1 script.sh input2 script.sh input3
这样,通过传递不同的输入参数,可以执行不同的操作,避免了创建多个相似的脚本文件的麻烦。
以上就是如何使用Python脚本来创建多个bash脚本的解决方法。通过这种方法,我们可以方便地管理和运行多个类似的脚本,提高工作效率。