问题描述
这是程序:
> cat test.py
print(input("A man walks into a: "))
> /usr/bin/python3 test.py
A man walks into a: bar
bar
根据 How to redirect output to a file and stdout,我尝试以下操作:
> /usr/bin/python3 test.py | tee foo.log
A man walks into a: bar
^C
> cat foo.log
A man walks into a:
请注意,我按了两次 ENTER 然后按 ^c 退出,否则它不会退出(它只是挂起)。
我可以减少测试用例如下:
/usr/bin/python -c 'print(input("A man walks into a: "))' | tee foo.log
我也尝试过:
x = input()
with open('quux.log','w') as f:
f.write(x)
... 不会创建 'quux.log'
可能出什么问题了?还有更强大的方法吗?
这是我的系统信息:
> ll /usr/bin/python3
-rwxr-xr-x 1 root wheel 134K 1 Jan 2020 /usr/bin/python3*
> /usr/bin/python3 --version
Python 3.8.2
> uname -a
Darwin pPro18.local 20.4.0 Darwin Kernel Version 20.4.0: Fri Mar 5 01:14:14 PST 2021; root:xnu-7195.101.1~3/RELEASE_X86_64 x86_64
> printenv
TERM_PROGRAM=Apple_Terminal
ANDROID_HOME=/Users/pi/Library/Android/sdk
SHELL=/bin/bash
TERM=xterm-256color
CLICOLOR=1
HISTSIZE=50000
TMPDIR=/var/folders/nj/rqdlt_hs4k5dwr5xrpgmn0kh0000gn/T/
TERM_PROGRAM_VERSION=440
OLDPWD=/Users/pi
TERM_SESSION_ID=864894DE-2B70-4E62-8ACB-E34D311CAE9D
HISTFILESIZE=50000
USER=pi
SSH_AUTH_SOCK=/private/tmp/com.apple.launchd.QipwN8s7AJ/Listeners
LSCOLORS=GxFxCxDxBxegedabagaced
PATH=.:/usr/local/anaconda3/bin:/Users/pi/.cargo/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin:/Users/pi/bin:/Users/pi/Library/Android/sdk:/Users/pi/Library/Android/sdk/platform-tools:/Users/pi/.cargo/bin:/Users/pi/Documents/go/bin:/usr/local/Cellar/go/1.14.1/libexec/bin
__CFBundleIdentifier=com.apple.Terminal
PWD=/Users/pi
LANG=en_GB.UTF-8
xpc_FLAGS=0x0
HISTCONTROL=ignoredups:erasedups:ignorespace
xpc_SERVICE_NAME=0
SHLVL=1
HOME=/Users/pi
GOROOT=/usr/local/Cellar/go/1.14.1/libexec
LOGNAME=pi
GOPATH=/Users/pi/Documents/go
PROMPT_COMMAND=update_terminal_cwd
history -a; history -c; history -r
NDK_ROOT=/Users/pi/Library/Android/sdk/ndk-bundle
_=/usr/bin/printenv
解决方法
使用标准库中的 sys
,您可以刷新 stdout 缓冲区并确保发出正确的退出信号,然后将其传递给 tee
。
test.py
#!/usr/bin/env python3
import sys
print(input("A man walks into a: "))
sys.stdout.flush()
sys.exit(0)
现在 tee
应该能够正确捕获所有输出:
$ python test.py | foo.log
A man walks into a: bar
bar
$ cat foo.log
A man walks into a: bar