rcv*_*rcv 2 python linux shell redirect
我有一个简单的python脚本,它只接受一个文件名,并吐出该文件的修改版本.我想重定向stdout(从命令行使用'>',以便我可以使用我的脚本覆盖我的修改文件,例如python myScript.py test.txt > test.txt
当我这样做时,生成的test.txt不包含原始test.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')
Run Code Online (Sandbox Code Playgroud)
的test.txt
Hello World
Run Code Online (Sandbox Code Playgroud)
结果python myScript.py test.txt > test.txt:
MODIFYING
MODIFIED!
Run Code Online (Sandbox Code Playgroud)
这样工作的原因是,在Python启动之前,Bash会解释重定向运算符并打开输出流以将stdout写入文件.该操作将文件截断为0 - 换句话说,它清除文件的内容.因此,当Python脚本启动时,它会看到一个空输入文件.
最简单的解决方案是将stdout重定向到另一个文件,然后将其重命名为原始文件名.
python myScript.py test.txt > test.out && mv test.out test.txt
Run Code Online (Sandbox Code Playgroud)
或者,您可以更改Python脚本以将修改后的数据写回文件本身,因此您根本不必重定向标准输出.