我有一个简单的python脚本,它只接受一个文件名,并输出该文件的修改版本。我想重定向stdout(从命令行使用'>;',这样我就可以使用我的脚本用我的修改覆盖一个文件,例如python myScript.py test.txt > test.txt
当我这样做,结果测试.txt不包含原始文本测试.txt-只是由myScript.py. 但是,如果我不重定向stdout,那么修改就会正确地出来。在
更具体地说,下面是一个例子:
在myScript.py以下内容:
#!/usr/bin/python
import sys
fileName = sys.argv[1]
sys.stderr.write('opening ' + fileName + '\n')
fileHandle = file(fileName)
currFile = fileHandle.read()
fileHandle.close()
sys.stdout.write('MODIFYING\n\n' + currFile + '\n\nMODIFIED!\n')
在测试.txt在
^{pr2}$python myScript.py test.txt > test.txt
的结果:
MODIFYING
MODIFIED!
Debian中的
moreutils
包中的实用程序sponge
可以优雅地处理这一问题。在正如其名称所示,
sponge
将在打开之前完全耗尽其标准输入测试.txt并写出stdin的全部内容。在你可以得到最新版本的海绵here。moreutils主页是here。在
尝试将其重定向到新文件,重定向运算符可能会在附加文件之前删除该文件。在
它这样工作的原因是,在Python启动之前,Bash会解释重定向操作符并打开一个输出流,将stdout写入文件。该操作将文件截断为0大小-换句话说,它清除文件的内容。因此,当Python脚本启动时,它会看到一个空的输入文件。在
最简单的解决方案是将stdout重定向到另一个文件,然后将其重命名为原始文件名。在
或者,可以修改Python脚本,将修改后的数据写回文件本身,这样就根本不必重定向标准输出。在
相关问题 更多 >
编程相关推荐