Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
检查Python脚本中的交互式shell_Python_Shell_Pipe_Interactive - Fatal编程技术网

检查Python脚本中的交互式shell

检查Python脚本中的交互式shell,python,shell,pipe,interactive,Python,Shell,Pipe,Interactive,我需要确定调用Python脚本的shell是否处于交互模式。如果是在交互模式下,程序应将输出管道设置为小于(1),以便于阅读。如果没有,它应该简单地将输出打印到标准输出,以便通过管道将其传送到打印机、文件或其他寻呼机 在shell脚本中,我会检查是否定义了提示变量$PS1,或者在$-变量中存储的标志中查找-I选项 从Python内部测试交互性的首选方法是什么?我为测试创建了一个cover类 例如,您有: class SuperInteractiveClass(object): def ge

我需要确定调用Python脚本的shell是否处于交互模式。如果是在交互模式下,程序应将输出管道设置为小于(1),以便于阅读。如果没有,它应该简单地将输出打印到标准输出,以便通过管道将其传送到打印机、文件或其他寻呼机

在shell脚本中,我会检查是否定义了提示变量$PS1,或者在$-变量中存储的标志中查找-I选项


从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