我有一个特定的应用程序组合,其中某个部分接受来自文件的一堆参数。我使用的所有东西都是基于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
答案 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)