我有一个特定的应用程序组合,其中的某个部分接受来自文件的一堆参数。 我使用的所有东西都是基于Linux的。
问题是,在我的工作pipe道中的东西不喜欢换行符。 一方面,我写这样一个脚本:
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")
但是,这些参数被作业pipe理器拒绝,除非我在运行之前手动编辑作业脚本。 如果我手动争夺换行符,做一些修改,它的工作。 如果我没有手动编辑(直接从python脚本),它不起作用。
是否有任何build议,为什么这个换行符(或可能是完全不同的东西)不被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 # ! / bin / csh - f \n # S 0000020 4142 4354 2048 2d2d 6f6a 2d62 616e 656d BATCH - - job - name 0000040 573d 3056 5f31 3032 3431 3730 3931 315f = WV 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 - test _ j 0000140 626f 230a 4253 5441 4843 2d20 6e2d 646f ob \n # SBATCH - - nod 0000160 7365 313d 230a 4253 5441 4843 2d20 632d od -xc <working_file> | tail -10 in : : 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 : : join : : 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 # ! / bin / csh - f \n # S 0000020 4142 4354 2048 2d2d 6f6a 2d62 616e 656d BATCH - - job - name 0000040 573d 3056 5f31 3032 3431 3630 3731 315f = WV 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 DF 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 - test _ j 0000140 626f 230a 4253 5441 4843 2d20 6e2d 646f ob \n # SBATCH - - nod 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 : : join : : 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
在你的编辑之后,问题现在已经清楚了: 非工作文件在命令( 工作文件中的最后\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
由于最后一行没有新的线,工作经理认为这是不完整的,不能处理它。 而且大多数编辑器都会在文本文件的末尾强制执行一个新行,这就解释了为什么文件上的任何版本都会生成一个工作文件 。
也许这个答案可能会帮助你:
from os import linesep with open("your_script_file", 'w') as f: f.write("your_data" + linesep) f.write("your_data_too" + linesep)
欲了解更多信息,请点击此链接: os.linesep
警告:
编写以文本模式打开的文件时(默认),不要使用os.linesep作为行结束符; 在所有平台上使用单个“\ n”。
如果本机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自动为您执行手动更改。 ( 文件 )