检查Python脚本中的交互式shell
我需要确定调用Python脚本的shell是否处于交互模式。如果是在交互模式下,程序应将输出管道设置为小于(1),以便于阅读。如果没有,它应该简单地将输出打印到标准输出,以便通过管道将其传送到打印机、文件或其他寻呼机 在shell脚本中,我会检查是否定义了提示变量$PS1,或者在$-变量中存储的标志中查找-I选项检查Python脚本中的交互式shell,python,shell,pipe,interactive,Python,Shell,Pipe,Interactive,我需要确定调用Python脚本的shell是否处于交互模式。如果是在交互模式下,程序应将输出管道设置为小于(1),以便于阅读。如果没有,它应该简单地将输出打印到标准输出,以便通过管道将其传送到打印机、文件或其他寻呼机 在shell脚本中,我会检查是否定义了提示变量$PS1,或者在$-变量中存储的标志中查找-I选项 从Python内部测试交互性的首选方法是什么?我为测试创建了一个cover类 例如,您有: class SuperInteractiveClass(object): def ge
从Python内部测试交互性的首选方法是什么?我为测试创建了一个cover类 例如,您有:
class SuperInteractiveClass(object):
def get_data_from_stdin(self):
'... a lot of code here ...'
'... and a lot of other function'
我做了第二节课,只是为了测试
class TestSuperInteractiveClass(SuperInteractiveClass):
prepared_data = []
def add_prepared_data(self,data):
self.prepared_data.append(data)
def get_data_from_stdin(self):
return self.prepared_data.pop(0)
从中,您可以使用相同的方法测试stdin是否与终端(tty)相关联,您可以使用以下方法执行此操作,例如:
>>> os.isatty(0)
True
注意:当您通过ssh远程调用命令时,从同一个链接来看,这将失败,给出的解决方案是测试stdin是否与管道关联。这通常工作得很好
import os, sys
if os.isatty(sys.stdout.fileno()):
...
如果您已经依赖matplotlib,或者您不介意引入matplotlib,您可以随时调用我更喜欢更明显的
sys.\uu stdin\uuuuuu.isatty(),除了读者必须了解足够的unix,才能知道文件0是stdin。你认为在stdin或stdout上检查isatty()有什么区别吗?@jforberg:是的,我认为最好的方法是@Evpok comment,sys.\uu stdin\uuuuuuu.isatty(),在我看来,Evpok的解决方案是最优雅和可读的。谢谢sys.stdout.isatty()
更短。而sys.\uu stdin\uuuu.isatty()
更可靠。(不受stdin
重定向和允许管道输出的影响)@Evpok:OP请求stdout,stdin完全无关。为了确定是否要分页输出,stdin确实是要检查的错误流,因为用户可以通过管道将某些内容导入程序(从而重定向stdin并断开它与tty的连接),但仍然希望在分页器中看到输出(因为stdout没有重定向)。@Evpok,你的意思是sys.\uu stdout\uu.isatty()
。当输入不是tty时,输出可能是tty,OP似乎对输入感兴趣output@lunaryom是的,我知道。但他确实写过“如果它是在交互模式下,程序应该将输出设置为更少(1)以便于阅读”。对我来说,这意味着他检查stdin
,并根据它的性质重定向stdout
。我不明白。这有什么意义?这是如何检查调用者的交互性的?它并没有,至少我不能理解。看起来他已经实现了一个堆栈。这只有在Python以-i选项启动时才是真的。用-i选项启动它将使Python在脚本运行后进入解释器模式。sys.flags.interactive不能用于确定当前shell环境的性质。请参阅的第1049行。is_interactive()只读取matplotlib中的全局变量。我看不到任何保证,它将引用父shell的交互性。
if sys.flags.interactive:
#interactive
else:
#not interactive