python 而非 运行 创建的批处理文件,但可通过记事本编辑

Batch files created by python not running, but edit by notepad works

我打算使用python创建一堆批处理文件,但是python创建的批处理文件无法上传,而手动输入的相同代码可以。我想知道为什么。

我的代码如下

import os

os.chdir("c:/Users/alku/Documents/Work/ToDo/data")
## creating a folder to place submit codes
if not os.path.exists('submit'):
    os.makedirs('submit')

depvar = ["01", "02", "03", "04", "05", "06", "07", "08", 
          "09", "10", "11", "12", "13", "14", "15", "16", 
          "17", "18", "19", "20", "21", "22", "23", "24"]
##creating corresponding batch codes for supercomputer
###creating a master file
fmaster= open('submit/submit-R-00.csh',"wb+")
fmaster.write(bytes(
'#!/bin/csh' + "\n" +
'#SBATCH --time=00:10:00' + "\n" +
'#SBATCH --mem=6000' + "\n" +
'#SBATCH --cores=1' + "\n"
, encoding='utf8'))
fmaster.close()

for i in depvar:
    fmaster= open('submit/submit-R-00.csh',"ab+")
    f= open('submit/submit-R-' + str(i) + '.csh',"wb+")
    f.write(bytes(
    '#!/bin/csh' + "\n" +
    '#SBATCH --time=96:00:00' + "\n" +
    '#SBATCH --mem=256000' + "\n" +
    '#SBATCH --cores=8' + "\n" +
    'module load R/3.5.1' + "\n" +
    'Rscript alku-COVIDImpact031-quantregForest-part'+ str(i) + '.R'
    , encoding='utf8'))
    ##writing into the master file
    fmaster.write(bytes(
    'sbatch submit-R-' + str(i) + '.csh'  + "\n"
    , encoding='utf8'))

结果类似于

#!/bin/csh
#SBATCH --time=96:00:00
#SBATCH --mem=256000
#SBATCH --cores=8
module load R/3.5.1
Rscript alku-COVIDImpact031-quantregForest-part01.R

用主文件提交-R-00.csh提交

#!/bin/csh
#SBATCH --time=00:10:00
#SBATCH --mem=6000
#SBATCH --cores=1
sbatch submit-R-01.csh
sbatch submit-R-02.csh
sbatch submit-R-03.csh
sbatch submit-R-04.csh
sbatch submit-R-05.csh
sbatch submit-R-06.csh
sbatch submit-R-07.csh
sbatch submit-R-08.csh
sbatch submit-R-09.csh
sbatch submit-R-10.csh
sbatch submit-R-11.csh
sbatch submit-R-12.csh
sbatch submit-R-13.csh
sbatch submit-R-14.csh
sbatch submit-R-15.csh
sbatch submit-R-16.csh
sbatch submit-R-17.csh
sbatch submit-R-18.csh
sbatch submit-R-19.csh
sbatch submit-R-20.csh
sbatch submit-R-21.csh
sbatch submit-R-22.csh
sbatch submit-R-23.csh
sbatch submit-R-24.csh

然而,当我将这些文件上传到我们大学的超级计算机时,超级计算机几乎立即取消了作业。此外,系统创建了一个全空的输出,所以我无法弄清楚发生了什么。

然后我用记事本输入了完全相同的代码,并将它们上传到超级计算机。不知何故这次它起作用了。这两个版本完全一样,我也是用vim来检查换行符。虽然问题解决了,但是我很好奇为什么python创建的相同代码不能提交,而手动输入可以。

for循环中,写入完成后,必须关闭文件

fmaster.close()
f.close()

尝试关闭文件并重试 避免丢失 f.close() 的最佳方法是使用 with,例如:

with open("filename") as f:
    for line in f:
        # ... do stuff ...

这将自动关闭文件。我们不需要明确地做 f.close()

使用with对文件进行操作。例如

with open("filename") as f:
    for line in f:
        # ... do stuff ...

避免显式关闭文件