我有一个看起来像这样的 Python 源文件:
import sys
x = sys.stdin.read()
print(x)
我想通过将它传递给 Python 的标准输入来调用这个源文件:
python < source.py
读完后source.py
,我希望 Python 程序从标准输入开始读取(如上所示)。这甚至可能吗?似乎解释器source.py
在收到 EOF 之前不会进行处理,但如果收到 EOF,sys.stdin.read()
则将无法工作。
我有一个看起来像这样的 Python 源文件:
import sys
x = sys.stdin.read()
print(x)
我想通过将它传递给 Python 的标准输入来调用这个源文件:
python < source.py
读完后source.py
,我希望 Python 程序从标准输入开始读取(如上所示)。这甚至可能吗?似乎解释器source.py
在收到 EOF 之前不会进行处理,但如果收到 EOF,sys.stdin.read()
则将无法工作。
使用另一个 FD。
import os
with os.fdopen(3, 'r') as fp:
for line in fp:
print line,
...
$ python < source.py 3< input.txt
如果您不想在示例之外的命令行上做任何花哨的事情,则必须首先在 python 脚本中将 stdin 重定向到终端。您可以通过tty
从 Python 中调用命令并获取 tty 的路径,然后将 sys.stdin 更改为该路径来做到这一点。
import sys, os
tty_path = os.popen('tty', 'r').read().strip() # Read output of "tty" command
sys.stdin = open(tty_path, 'r') # Open the terminal for reading and set stdin to it
我相信这应该做你想做的事。
编辑:
我错了。对于您的用例,这将失败。您需要某种方式将当前 TTY 路径传递给脚本。试试这个:
import sys, os
tty_path = os.environ['TTY']
sys.stdin = open(tty_path, 'r') # Open the terminal for reading and set stdin to it
但是您必须以稍有不同的方式调用该脚本:
TTY=`tty` python < source.py
我应该补充一点,我认为最明智的方法——完全避免这个问题——是根本不将脚本重定向到 python 的标准输入,而只是使用python source.py
.