在另一个作业中不接受Python脚本中生成的换行符

时间:2017-03-09 13:51:09

标签: python linux newline

我有一个特定的应用程序组合,其中某个部分接受来自文件的一堆参数。我使用的所有东西都是基于Linux的。

问题是,我的工作管道中的某些东西不喜欢换行符。一方面,我写了一个这样的脚本:

with open(job_script_file, 'w') as f:
     f.write("parameter 1 goes here\n")
     f.write("parameter 2 goes here\n")
     f.write("python script call plus arguments here")

然而,这些参数被作业管理器拒绝,除非我在运行之前手动编辑作业脚本。如果我手动加扰换行符,做一些修改,它就可以了。如果我根本不进行手动编辑(直接来自python脚本),它就不起作用。

有什么建议可以解释为什么这个换行符(或者可能是完全不同的东西)没有被csh作业脚本正确接受/读取?

我试过的一件事是使用sed -i来编辑文件并在python调用之前添加一个空行:

sed -i 's/^python/\n\python/g'

在编辑文件时,问题仍然存在。

更新:根据评论中的要求,文件的头/尾hexdump有效(手动编辑文件后):

od -xc <working_file> | head -15
0000000    2123    622f    6e69    632f    6873    2d20    0a66    5323
          #   !   /   b   i   n   /   c   s   h       -   f  \n   #   S
0000020    4142    4354    2048    2d2d    6f6a    2d62    616e    656d
          B   A   T   C   H       -   -   j   o   b   -   n   a   m   e
0000040    573d    3056    5f31    3032    3431    3730    3931    315f
          =   W   V   0   1   _   2   0   1   4   0   7   1   9   _   1
0000060    3230    3030    3031    3230    3946    3344    3045    5f30
          0   2   0   0   1   0   0   2   F   9   D   3   E   0   0   _
0000100    3031    3032    3130    3030    3133    3634    3130    3030
          1   0   2   0   0   1   0   0   3   1   4   6   0   1   0   0
0000120    322d    3130    3037    3033    2d36    6574    7473    6a5f
          -   2   0   1   7   0   3   0   6   -   t   e   s   t   _   j
0000140    626f    230a    4253    5441    4843    2d20    6e2d    646f
          o   b  \n   #   S   B   A   T   C   H       -   -   n   o   d
0000160    7365    313d    230a    4253    5441    4843    2d20    632d

od -xc <working_file> | tail -10
          i   n   :   :   1   0   2   0   0   1   0   0   3   1   4   6
0007140    3130    3030    3520    3030    3733    3238    3432    3231
          0   1   0   0       5   0   0   3   7   8   2   2   4   1   2
0007160    3a30    6a3a    696f    3a6e    353a    3030    3733    3339
          0   :   :   j   o   i   n   :   :   5   0   0   3   7   9   3
0007200    3337    3131    2030    3222    3130    2d34    3730    312d
          7   3   1   1   0       "   2   0   1   4   -   0   7   -   1
0007220    2239    000a
          9   "  \n
0007223

和非工作文件相同:

od -xc <non-working_file> | head -15
0000000    2123    622f    6e69    632f    6873    2d20    0a66    5323
          #   !   /   b   i   n   /   c   s   h       -   f  \n   #   S
0000020    4142    4354    2048    2d2d    6f6a    2d62    616e    656d
          B   A   T   C   H       -   -   j   o   b   -   n   a   m   e
0000040    573d    3056    5f31    3032    3431    3630    3731    315f
          =   W   V   0   1   _   2   0   1   4   0   6   1   7   _   1
0000060    3230    3030    3031    3230    3844    4644    3035    5f30
          0   2   0   0   1   0   0   2   D   8   D   F   5   0   0   _
0000100    3031    3032    3130    3030    3233    3241    3132    3030
          1   0   2   0   0   1   0   0   3   2   A   2   2   1   0   0
0000120    322d    3130    3037    3033    2d36    6574    7473    6a5f
          -   2   0   1   7   0   3   0   6   -   t   e   s   t   _   j
0000140    626f    230a    4253    5441    4843    2d20    6e2d    646f
          o   b  \n   #   S   B   A   T   C   H       -   -   n   o   d
0000160    7365    313d    230a    4253    5441    4843    2d20    632d


od -xc <non-working_file> | tail -10
          n   :   :   1   0   2   0   0   1   0   0   3   2   A   2   2
0007140    3031    2030    3035    3330    3536    3037    3136    3038
          1   0   0       5   0   0   3   6   5   7   0   6   1   8   0
0007160    3a3a    6f6a    6e69    3a3a    3035    3330    3837    3833
          :   :   j   o   i   n   :   :   5   0   0   3   7   8   3   8
0007200    3134    3035    2220    3032    3431    302d    2d36    3731
          4   1   5   0       "   2   0   1   4   -   0   6   -   1   7
0007220    0022
          "
0007221

3 个答案:

答案 0 :(得分:2)

编辑完成后问题现在已清除:非工作文件在命令后(工作文件中的最后一个\n )缺少换行符。修复现在很简单,只需在最后一次写入时添加:

with open(job_script_file, 'w') as f:
     f.write("parameter 1 goes here\n")
     f.write("parameter 2 goes here\n")
     f.write("python script call plus arguments here\n")  # \n to cleanly end the command

由于最后一行没有换行,作业经理认为它没有完成,无法处理。大多数编辑在文本文件的末尾始终强制使用新行,这解释了为什么文件上的任何版本都会生成工作文件

答案 1 :(得分:1)

也许这个答案可以帮到你:

adapter

有关详情,请点击此链接:os.linesep

警告:

  

在打开文件时,不要将os.linesep用作行终止符   在文本模式下(默认);在所有上使用单个'\ n'代替   平台。

答案 2 :(得分:0)

如果原生Python解决方案不起作用,首先应该尝试这个:

with open(job_script_file, 'w') as f:
     f.write("parameter 1 goes here@")
     f.write("parameter 2 goes here@")
     f.write("python script call plus arguments here")

然后:

tr '@' '\n' < file.txt

如果您可以理所当然地认为参赛者不会出现@字符。也可以尝试\ r而不是\ n,看看会发生什么。

否则,作为最后的手段,您可以使用xdotool自动为您进行手动更改。 (documentation