如何从stdin运行Python源代码本身从stdin读取?

时间:2013-10-15 13:59:08

标签: python

我有一个Python源文件,如下所示:

import sys
x = sys.stdin.read()
print(x)

我想通过将它传递给Python的stdin来调用这个源文件:

python < source.py

在读取source.py之后,我希望Python程序从stdin开始读取(如上所示)。这甚至可能吗?似乎解释器在获得EOF之前不会处理source.py,但如果收到EOF,则sys.stdin.read()将无效。

2 个答案:

答案 0 :(得分:7)

使用另一个FD。

import os

with os.fdopen(3, 'r') as fp:
  for line in fp:
    print line,

...

$ python < source.py 3< input.txt

答案 1 :(得分:1)

如果你不希望在你的例子之外的命令行上做任何花哨的东西,你将不得不在你的python脚本中将stdin重定向到你的终端。您可以通过从Python中调用命令tty并获取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的stdin,只需用python source.py调用它。