精华内容
下载资源
问答
  • stdin
    千次阅读
    2018-12-10 17:08:28
    1. ssh 10.10.17.2 "echo 'abcd' | passwd --stdin root"

    更多相关内容
  • get-stdin 将作为字符串或缓冲区获取 安装 $ npm install get-stdin 用法 // example.js import getStdin from 'get-stdin' ; console . log ( await getStdin ( ) ) ; //=> 'unicorns' $ echo unicorns | node ...
  • 在本篇文章中小编给大家分享了关于Python里如何读取stdin的知识点以及相关实例内容,需要的朋友们学习参考下。
  • c3io利用stdin和stdout进行,以便与其他进程进行通信。 如果您只想在nodejs中与父子进行通信,则只需使用标准。 进展中-不稳定 用例 看看使用c3io与沟通的手段容器。 基本用法 var c3io = require('c3io')...
  • 主要介绍了Python 中sys.stdin.readline()的用法,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
  • 本文主要介绍C语言清空输入缓冲区在标准输入(stdin)情况下的使用。
  • 只需从stdin中读取传入的文本,然后将传出的文本写入stdout。 消息传递很简单。 每个入站WebSocket连接都会在专用过程中运行您的程序。 连接按进程隔离。 适用于Linux,OSX,Windows,FreeBSD,OpenBSD和Solaris。 ...
  • 懒惰是一个小的实用程序,它读取stdin并非常非常缓慢地将其回显。 懒惰懒惰是一个小的实用程序,它读取stdin并非常非常缓慢地将其回显。 默认情况下,它将在输入字节之间Hibernate10ms,但是您可以使用以下参数指定...
  • 简单的样板Java类读取stdin 用法 输入将被写入input.txt并通过管道传递到Java程序。 运行Java程序: $ ./run.sh < java>
  • 有助于在多个CPU内核甚至多个计算机上拆分作业。 示例:tar -cf-/ bigdirectory | splitjob -j 4 gzip> big.tar.gz splitjob“ ssh h1 bzip2”“ ssh h2 bzip2” <f> f.bz2
  • get-stdin - 获得stdin作为一个字符串或缓冲区
  • 已结贴√问题点数:20回复次数:4 scanf如何从stdin中读取数据的scanf(格式控制,地址表列)int scanf(char *format[,argument,...]);“格式控制”的含义同printf函数;“地址表列”是由若干个地址组成的表列,可以是...

    已结贴√

    问题点数:20 回复次数:4

    ca56232b3bbedf9a539d07f37fffb99a.gif

    3144d8b7615c79d9f638db40d5689d26.gif

    a218af6549b45ee526caf607ebff1358.gif

    0f8df0e29816ae721419de940fb833d1.gif

    scanf如何从stdin中读取数据的

    scanf(格式控制,地址表列)

    int scanf(char *format[,argument,...]);

    “格式控制”的含义同printf函数;“地址表列”是由若干个地址组成的表列,可以是变量的地址,或字符串首地址。

    scanf()函数返回成功赋值的数据项数,出错时则返回EOF。

    例:使用scanf函数输入数据。

    #include

    void main()

    {

    int a,b,c;

    printf("input a,b,c\n");

    scanf("%d%d%d",&a,&b,&c);

    printf("a=%d,b=%d,c=%d",a,b,c);

    }

    [编辑本段]

    格式字符说明

    %a,%A 读入一个浮点值(仅C99有效)

    %c 读入一个字符

    %d 读入十进制整数

    %i 读入十进制,八进制,十六进制整数

    %o 读入八进制整数

    %x,%X 读入十六进制整数

    %c 读入一个字符

    %s 读入一个字符串,遇空格、制表符或换行符结束。

    %f,%F,%e,%E,%g,%G 用来输入实数,可以用小数形式或指数形式输入。

    %p 读入一个指针

    %u 读入一个无符号十进制整数

    %n 至此已读入值的等价字符数

    %[] 扫描字符集合

    %% 读%符号

    附加格式说明字符表修饰符说明

    L/l 长度修饰符 输入"长"数据

    h 长度修饰符 输入"短"数据

    W 整型常数 指定输入数据所占宽度

    * 表示本输入项在读入后不赋值给相应的变量

    [编辑本段]

    scanf的返回值

    scanf的返回值有后面的参数决定

    scanf("%d%d", &a, &b);

    如果a和b都被成功读入,那么scanf的返回值就是2

    如果只有a被成功读入,返回值为1

    如果a和b都未被成功读入,返回值为0

    如果遇到错误或遇到end of file,返回值为EOF。

    且返回值为int型.

    [编辑本段]

    使用scanf函数时应该注意的问题

    1、sacnf()中的变量必须使用地址。

    2、scanf()的格式控制串可以使用其它非空白字符,但在输入时必须输入这些字符。

    3、在用"%c"输入时,空格和“转义字符”均作为有效字符。

    问题一:scanf()函数不能正确接受有空格的字符串?如: I love you!

    #include

    int main()

    {

    char str[80];

    scanf("%s",str);

    printf("%s",str);

    return 0;

    }

    输入:I love you!

    输出:scanf()函数接收输入数据时,遇以下情况结束一个数据的输入:(不是结束该scanf函数,scanf函数仅在每一个数据域均有数据,并按回车后结束)。

    ① 遇空格、“回车”、“跳格”键。

    ② 遇宽度结束。

    ③ 遇非法输入。

    所以,上述程序并不能达到预期目的,scanf()扫描到"I"后面的空格就认为对str的赋 值结束,并忽略后面的"love you!".这里要注意是"love you!"还在键盘缓冲区(关于这个问题,网上我所见的说法都是如此,但是,我经过调试发现,其实这时缓冲区字符串首尾指针已经相等了,也就是说缓冲区清 空了,scanf()函数应该只是扫描stdin流,这个残存信息是在stdin中)。我们改动一下上面的程序来验证一下:

    #include

    int main()

    {

    char str[80];

    char str1[80];

    char str2[80];

    scanf("%s",str);/*此处输入:I love you! */

    printf("%s",str);

    sleep(5);/*这里等待5秒,告诉你程序运行到什么地方*/

    scanf("%s",str1);/*这两句无需你再输入,是对键盘盘缓冲区再扫描 */

    scanf("%s",str2);/*这两句无需你再输入,是对键盘盘缓冲区再扫描 */

    printf("\n%s",str1);

    printf("\n%s",str2);

    return 0;

    }

    输入:I love you!

    输出:

    I

    love

    you!

    好了,原因知道了,那么scanf()函数能不能完成这个任务?回答是:能!别忘了scanf()函数还有一个 %[] 格式控制符(如果对%[]不了解的请查看本文的上篇),请看下面的程序:

    #include "stdio.h"

    int main()

    {

    char string[50];/*scanf("%s",string);不能接收空格符*/

    scanf("%[^\n]",string);

    printf("%s\n",string);

    return 0;

    }

    问题二:键盘缓冲区残余信息问题

    #include

    int main()

    {

    int a;

    char c; do

    {

    scanf("%d",&a);

    scanf("%c",&c);

    printf("a=%d c=%c\n",a,c);/*printf("c=%d\n",c);*/

    }while(c!='N');

    }

    scanf("%c",&c);这句不能正常接收字符,什么原因呢?我们用 printf("c=%d\n",c);将C用int表示出来,启用printf("c=%d\n",c);这一句,看看scanf()函数赋给C到底是 什么,结果是c=10 ,ASCII值为10是什么?换行即\n.对了,我们每击打一下"Enter"键,向键盘缓冲区发去一个“回车”(\r),一个“换行"(\n),在这里 \r被scanf()函数处理掉了(姑且这么认为吧^_^),而\n被scanf()函数“错误”地赋给了c.解决办法:可以在两个scanf()函数之 后加个fflush(stdin);,还有加getch() , getchar()也可以,但是要视具体scanf()语句加那个,这里就不分析了,读者自己去摸索吧。但是加fflush(stdin);不管什么情况都可行。

    (

    函数名: fflush

    功 能: 清除一个流

    用 法: int fflush(FILE *stream);

    )

    #include

    int main()

    {

    int a;

    char c; do

    {

    scanf("%d",&a);

    fflush(stdin);

    scanf("%c",&c);

    fflush(stdin);

    printf("a=%d c=%c\n",a,c); }while(c!='N');

    }

    这里再给一个用“空格符”来处理缓冲区残余信息的示例:运行出错的程序:

    #include

    int main()

    {

    int i;

    char j;

    for(i = 0;i < 10;i++)

    {

    scanf("%c",&j);/*这里%前没有空格*/

    }

    }

    使用了空格控制符后:

    #include

    int main()

    {

    int i;

    char j;

    for(i = 0;i < 10;i++)

    {

    scanf(" %c",&j);/*注意这里%前有个空格*/

    }

    }

    可以运行看看两个程序有什么不同。

    问题三: 如何处理scanf()函数误输入造成程序死锁或出错?

    #include

    int main()

    {

    int a,b,c; /*计算a+b*/

    scanf("%d,%d",&a,&b);

    c=a+b;

    printf("%d+%d=%d",a,b,c);

    }

    如上程序,如果正确输入a,b的值,那么没什么问题,但是,你不能保证使用者每一次都能正确输 入,一旦输入了错误的类型,你的程序不是死锁,就是得到一个错误的结果,呵呵,这可能所有人都遇到过的问题吧?解决方法:scanf()函数执行成功时的 返回值是成功读取的变量数,也就是说,你这个scanf()函数有几个变量,如果scanf()函数全部正常读取,它就返回几。但这里还要注意另一个问 题,如果输入了非法数据,键盘缓冲区就可能还个有残余信息问题。正确的例程:

    #include

    int main()

    {

    int a,b,c; /*计算a+b*/

    while(scanf("%d,%d",&a,&b)!=2)fflush(stdin);

    c=a+b;

    printf("%d+%d=%d",a,b,c);

    }

    补充: fflush(stdin)这个方法在GCC下不可用。(在VC6.0下可以)

    以下是 C99 对 fflush 函数的定义:

    int fflush(FILE *stream);

    如果stream指向输出流或者更新流(update stream),并且这个更新流

    最近执行的操作不是输入,那么fflush函数将把任何未被写入的数据写入stream

    指向的文件(如标准输出文件stdout)。否则,fflush函数的行为是不确定的。

    fflush(NULL)清空所有输出流和上面提到的更新流。如果发生写错误,fflush

    函数会给那些流打上错误标记,并且返回EOF,否则返回0。

    由此可知,如果 stream 指向输入流(如 stdin),那么 fflush 函数的行为是不确定的。故而使用

    fflush(stdin) 是不正确的,至少是移植性不好的。

    可采用如下方法:

    /* 此函数完全可以和scanf函数一起使用,无论输入何种类型的数据,但不能和gets一起使用 */

    void flush()

    {

    char c;

    while ((c=getchar()) != '\n'&&c!=EOF) ;

    }

    #include

    int main()

    {

    int a,b,c; /*计算a+b*/

    while(scanf("%d,%d",&a,&b)!=2) flush();

    c=a+b;

    printf("%d+%d=%d",a,b,c);

    }

    搜索更多相关主题的帖子:

    数据 stdin scanf

    展开全文
  • 向数据库导入数据?试试COPY FROM STDIN语句

    千次阅读 多人点赞 2022-03-16 09:08:25
    用户可以使用以下方式通过COPY FROM STDIN语句直接向openGauss写入数据。 通过键盘输入向openGauss数据库写入数据。详细请参见COPY。 通过JDBC驱动的CopyManager接口从文件或者数据库向openGauss写入数据。此方法...

    用户可以使用以下方式通过COPY FROM STDIN语句直接向openGauss写入数据。

    • 通过键盘输入向openGauss数据库写入数据。详细请参见COPY
    • 通过JDBC驱动的CopyManager接口从文件或者数据库向openGauss写入数据。此方法支持COPY语法中copy option的所有参数。

    1.CopyManager类简介

    CopyManager是 openGauss JDBC驱动中提供的一个API接口类,用于批量向openGauss数据库中导入数据。

    CopyManager的继承关系

    CopyManager类位于org.postgresql.copy Package中,继承自java.lang.Object类,该类的声明如下:

    public class CopyManager
    extends Object
    

    构造方法

    public CopyManager(BaseConnection connection)

    throws SQLException

    常用方法

    表 1 CopyManager常用方法

    返回值

    方法

    描述

    throws

    CopyIn

    copyIn(String sql)

    -

    SQLException

    long

    copyIn(String sql, InputStream from)

    使用COPY FROM STDIN从InputStream中快速向数据库中的表导入数据。

    SQLException,IOException

    long

    copyIn(String sql, InputStream from, int bufferSize)

    使用COPY FROM STDIN从InputStream中快速向数据库中的表导入数据。

    SQLException,IOException

    long

    copyIn(String sql, Reader from)

    使用COPY FROM STDIN从Reader中快速向数据库中的表导入数据。

    SQLException,IOException

    long

    copyIn(String sql, Reader from, int bufferSize)

    使用COPY FROM STDIN从Reader中快速向数据库中的表导入数据。

    SQLException,IOException

    CopyOut

    copyOut(String sql)

    -

    SQLException

    long

    copyOut(String sql, OutputStream to)

    将一个COPY TO STDOUT的结果集从数据库发送到OutputStream类中。

    SQLException,IOException

    long

    copyOut(String sql, Writer to)

    将一个COPY TO STDOUT的结果集从数据库发送到Writer类中。

    SQLException,IOException

    2. 处理错误表

    操作场景

    当数据导入发生错误时,请根据本文指引信息进行处理。

    查询错误信息

    数据导入过程中发生的错误,一般分为数据格式错误和非数据格式错误。

    • 数据格式错误

      在创建外表时,通过设置参数“LOG INTO error_table_name”,将数据导入过程中出现的数据格式错误信息写入指定的错误信息表error_table_name中。您可以通过以下SQL,查询详细错误信息。

      openGauss=# SELECT * FROM error_table_name;
      

      错误信息表结构如表1所示。

      表 1 错误信息表

      列名称

      类型

      描述

      nodeid

      integer

      报错节点编号。

      begintime

      timestamp with time zone

      出现数据格式错误的时间。

      filename

      character varying

      出现数据格式错误的数据源文件名。

      rownum

      numeric

      在数据源文件中,出现数据格式错误的行号。

      rawrecord

      text

      在数据源文件中,出现数据格式错误的原始记录。

      detail

      text

      详细错误信息。

    • 非数据格式错误

      对于非数据格式错误,一旦发生将导致整个数据导入失败。您可以根据执行数据导入过程中,界面提示的错误信息,帮助定位问题,处理错误表。

    处理数据导入错误

    根据获取的错误信息,请对照下表,处理数据导入错误。

    表 2 处理数据导入错误

    错误信息

    原因

    解决办法

    missing data for column “r_reason_desc”

    1. 数据源文件中的列数比外表定义的列数少。
    2. 对于TEXT格式的数据源文件,由于转义字符(\)导致delimiter(分隔符)错位或者quote(引号字符)错位造成的错误。

      示例:目标表存在3列字段,导入的数据如下所示。由于存在转义字符“\”,分隔符“|”被转义为第二个字段的字段值,导致第三个字段值缺失。

      BE|Belgium|1
    1. 由于列数少导致的报错,选择下列办法解决:
      • 在数据源文件中,增加列“r_reason_desc”的字段值。
      • 在创建外表时,将参数“fill_missing_fields”设置为“on”。即当导入过程中,若数据源文件中一行数据的最后一个字段缺失,则把最后一个字段的值设置为NULL,不报错。
    2. 对由于转义字符导致的错误,需检查报错的行中是否含有转义字符(\)。若存在,建议在创建外表时,将参数“noescaping”(是否不对'\'和后面的字符进行转义)设置为true。

    extra data after last expected column

    数据源文件中的列数比外表定义的列数多。

    • 在数据源文件中,删除多余的字段值。
    • 在创建外表时,将参数“ignore_extra_data”设置为“on”。即在导入过程中,若数据源文件比外表定义的列数多,则忽略行尾多出来的列。

    invalid input syntax for type numeric: “a”

    数据类型错误。

    在数据源文件中,修改输入字段的数据类型。根据此错误信息,请将输入的数据类型修改为numeric。

    null value in column “staff_id” violates not-null constraint

    非空约束。

    在数据源文件中,增加非空字段信息。根据此错误信息,请增加“staff_id”列的值。

    duplicate key value violates unique constraint “reg_id_pk”

    唯一约束。

    • 删除数据源文件中重复的行。
    • 通过设置关键字“DISTINCT”,从SELECT结果集中删除重复的行,保证导入的每一行都是唯一的。
      openGauss=# INSERT INTO reasons SELECT DISTINCT * FROM foreign_tpcds_reasons;

    value too long for type character varying(16)

    字段值长度超过限制。

    在数据源文件中,修改字段值长度。根据此错误信息,字段值长度限制为VARCHAR2(16)。

    3. 示例1:通过本地文件导入导出数据

    在使用JAVA语言基于openGauss进行二次开发时,可以使用CopyManager接口,通过流方式,将数据库中的数据导出到本地文件或者将本地文件导入数据库中,文件格式支持CSV、TEXT等格式。

    样例程序如下,执行时需要加载openGauss的JDBC驱动。

    import java.sql.Connection; 
    import java.sql.DriverManager; 
    import java.io.IOException;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.sql.SQLException; 
    import org.postgresql.copy.CopyManager; 
    import org.postgresql.core.BaseConnection;
     
    public class Copy{ 
    
         public static void main(String[] args) 
         { 
          String urls = new String("jdbc:postgresql://localhost:8000/postgres"); //数据库URL 
          String username = new String("username");            //用户名 
          String password = new String("passwd");             //密码 
          String tablename = new String("migration_table"); //定义表信息 
          String tablename1 = new String("migration_table_1"); //定义表信息 
          String driver = "org.postgresql.Driver"; 
          Connection conn = null; 
          
          try { 
              Class.forName(driver); 
              conn = DriverManager.getConnection(urls, username, password);         
          } catch (ClassNotFoundException e) { 
               e.printStackTrace(System.out); 
          } catch (SQLException e) { 
               e.printStackTrace(System.out); 
          } 
          
          // 将表migration_table中数据导出到本地文件d:/data.txt  
          try {
              copyToFile(conn, "d:/data.txt", "(SELECT * FROM migration_table)");
          } catch (SQLException e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
          } catch (IOException e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
          }    
          //将d:/data.txt中的数据导入到migration_table_1中。
          try {
              copyFromFile(conn, "d:/data.txt", tablename1);
          } catch (SQLException e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
          } catch (IOException e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
          }  
    
          // 将表migration_table_1中的数据导出到本地文件d:/data1.txt  
          try {
              copyToFile(conn, "d:/data1.txt", tablename1);
          } catch (SQLException e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
          } catch (IOException e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
          }        
      } 
    
      public static void copyFromFile(Connection connection, String filePath, String tableName)   
             throws SQLException, IOException {  
           
         FileInputStream fileInputStream = null;  
       
         try {  
             CopyManager copyManager = new CopyManager((BaseConnection)connection);  
             fileInputStream = new FileInputStream(filePath);  
             copyManager.copyIn("COPY " + tableName + " FROM STDIN with (" + "DELIMITER"+"'"+ delimiter +  "'" + "ENCODING " + "'" + encoding + "')", fileInputStream);                        
         } finally {  
             if (fileInputStream != null) {  
                 try {  
                     fileInputStream.close();  
                 } catch (IOException e) {  
                     e.printStackTrace();  
                 }  
             }  
         }  
     }  
         public static void copyToFile(Connection connection, String filePath, String tableOrQuery)   
              throws SQLException, IOException {  
            
          FileOutputStream fileOutputStream = null;  
       
          try {  
              CopyManager copyManager = new CopyManager((BaseConnection)connection);  
              fileOutputStream = new FileOutputStream(filePath);  
              copyManager.copyOut("COPY " + tableOrQuery + " TO STDOUT", fileOutputStream);  
          } finally {  
              if (fileOutputStream != null) {  
                  try {  
                      fileOutputStream.close();  
                  } catch (IOException e) {  
                      e.printStackTrace();  
                  }  
              }  
          }  
      }  
    }

    4. 示例2:从MY向openGauss数据库进行数据迁移

    下面示例演示如何通过CopyManager从MY向openGauss数据库进行数据迁移的过程。

    import java.io.StringReader;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    import org.postgresql.copy.CopyManager;
    import org.postgresql.core.BaseConnection;
    
    public class Migration{
    
        public static void main(String[] args) {
            String url = new String("jdbc:postgresql://localhost:8000/postgres"); //数据库URL 
            String user = new String("username");            //openGauss数据库用户名 
            String pass = new String("passwd");             //openGauss数据库密码 
            String tablename = new String("migration_table_1"); //定义表信息 
            String delimiter = new String("|");              //定义分隔符 
            String encoding = new String("UTF8");            //定义字符集 
            String driver = "org.postgresql.Driver";
            StringBuffer buffer = new StringBuffer();       //定义存放格式化数据的缓存 
    
            try {
                //获取源数据库查询结果集 
                ResultSet rs = getDataSet();
    
                //遍历结果集,逐行获取记录 
                //将每条记录中各字段值,按指定分隔符分割,由换行符结束,拼成一个字符串 
                //把拼成的字符串,添加到缓存buffer 
                while (rs.next()) {
                    buffer.append(rs.getString(1) + delimiter
                            + rs.getString(2) + delimiter
                            + rs.getString(3) + delimiter
                            + rs.getString(4)
                            + "\n");
                }
                rs.close();
    
                try {
                    //建立目标数据库连接 
                    Class.forName(driver);
                    Connection conn = DriverManager.getConnection(url, user, pass);
                    BaseConnection baseConn = (BaseConnection) conn;
                    baseConn.setAutoCommit(false);
    
                    //初始化表信息   
                    String sql = "Copy " + tablename + " from STDIN with (DELIMITER " + "'" + delimiter + "'" +","+ " ENCODING " + "'" + encoding + "'");
    
                    //提交缓存buffer中的数据                   
                    CopyManager cp = new CopyManager(baseConn);
                    StringReader reader = new StringReader(buffer.toString());
                    cp.copyIn(sql, reader);
                    baseConn.commit();
                    reader.close();
                    baseConn.close();
                } catch (ClassNotFoundException e) {
                    e.printStackTrace(System.out);
                } catch (SQLException e) {
                    e.printStackTrace(System.out);
                }
    
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        //******************************** 
        // 从源数据库返回查询结果集     
        //********************************* 
        private static ResultSet getDataSet() {
            ResultSet rs = null;
            try {
                Class.forName("com.MY.jdbc.Driver").newInstance();
                Connection conn = DriverManager.getConnection("jdbc:MY://10.119.179.227:3306/jack?useSSL=false&allowPublicKeyRetrieval=true", "jack", "Gauss@123");
                Statement stmt = conn.createStatement();
                rs = stmt.executeQuery("select * from migration_table");
            } catch (SQLException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return rs;
        }
    }

    展开全文
  • 我正在为比赛制作机器人,该机器人通过sys.stdin接收其输入,并使用Python的print()作为输出。 我有以下内容:12345678import sysdef main():while True:line = sys.stdin.readline()parts = line.split()if len...

    我正在为比赛制作机器人,该机器人通过sys.stdin接收其输入,并使用Python的print()作为输出。 我有以下内容:

    1

    2

    3

    4

    5

    6

    7

    8import sys

    def main():

    while True:

    line = sys.stdin.readline()

    parts = line.split()

    if len(parts) > 0:

    # do stuff

    问题在于输入是通过流输入的,并且使用上述输入,使我无法打印任何内容,直到关闭流。 我该怎么做才能使这项工作?

    也许重复

    在stdin上进行非阻塞要么不起作用,要么不十分可靠。 是否允许使用线程/多处理? 应该起作用的原因

    通过关闭阻止功能,您一次只能读取一个字符。因此,没有办法让readline()在非阻塞上下文中工作。我假设您只是想阅读按键来控制机器人。

    我在Linux上使用select.select()并没有运气,并通过调整termios设置创建了一种方法。因此,这是特定于Linux的,但对我有用:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32old_settings=None

    def init_anykey():

    global old_settings

    old_settings = termios.tcgetattr(sys.stdin)

    new_settings = termios.tcgetattr(sys.stdin)

    new_settings[3] = new_settings[3] & ~(termios.ECHO | termios.ICANON) # lflags

    new_settings[6][termios.VMIN] = 0 # cc

    new_settings[6][termios.VTIME] = 0 # cc

    termios.tcsetattr(sys.stdin, termios.TCSADRAIN, new_settings)

    @atexit.register

    def term_anykey():

    global old_settings

    if old_settings:

    termios.tcsetattr(sys.stdin, termios.TCSADRAIN, old_settings)

    def anykey():

    ch_set = []

    ch = os.read(sys.stdin.fileno(), 1)

    while ch != None and len(ch) > 0:

    ch_set.append( ord(ch[0]) )

    ch = os.read(sys.stdin.fileno(), 1)

    return ch_set;

    init_anykey()

    while True:

    key = anykey()

    if key != None:

    print key

    else:

    time.sleep(0.1)

    更好的Windows或跨平台答案在这里:Python非阻塞控制台输入

    请注意,这也会使终端"不回声":未显示按键。 这是实现此目的的另一种优雅方式:ballingt.com/nonblocking-stdin-in-python-3

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20#-----------------------------------------------------------------------

    # Get a character from the keyboard. If Block is True wait for input,

    # else return any available character or throw an exception if none is

    # available. Ctrl+C isn't handled and continues to generate the usual

    # SIGINT signal, but special keys like the arrows return the expected

    # escape sequences.

    #

    # This requires:

    #

    # import sys, select

    #

    # This was tested using python 2.7 on Mac OS X. It will work on any

    # Linux system, but will likely fail on Windows due to select/stdin

    # limitations.

    #-----------------------------------------------------------------------

    def GetChar(Block=True):

    if Block or select.select([sys.stdin], [], [], 0) == ([sys.stdin], [], []):

    return sys.stdin.read(1)

    raise error('NoChar')

    我相信我曾经在Linux上尝试过,但我认为它没有用。 但是,在Mac上我现在正在使用,它绝对不起作用。 无论block是true还是false,它仍然会阻塞。 此外,用户必须按Enter键才能释放积累的字符"泛滥"。 也许尝试将输入模式设置为raw(tty.setraw()),但是之后必须将其设置为煮熟模式。

    您可以使用选择器来处理I / O多路复用:

    https://docs.python.org/3/library/selectors.html

    试试看:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25#! /usr/bin/python3

    import sys

    import fcntl

    import os

    import selectors

    # set sys.stdin non-blocking

    orig_fl = fcntl.fcntl(sys.stdin, fcntl.F_GETFL)

    fcntl.fcntl(sys.stdin, fcntl.F_SETFL, orig_fl | os.O_NONBLOCK)

    # function to be called when enter is pressed

    def got_keyboard_data(stdin):

    print('Keyboard input: {}'.format(stdin.read()))

    # register event

    m_selector = selectors.DefaultSelector()

    m_selector.register(sys.stdin, selectors.EVENT_READ, got_keyboard_data)

    while True:

    sys.stdout.write('Type something and hit enter: ')

    sys.stdout.flush()

    for k, mask in m_selector.select():

    callback = k.data

    callback(k.fileobj)

    上面的代码将保留

    1for k, mask in m_selector.select():

    直到发生注册的事件为止,返回选择器(key)实例(k)和受监视事件的掩码。

    在上面的示例中,我们仅注册了一个事件(按Enter键):

    1m_selector.register(sys.stdin, selectors.EVENT_READ, got_keyboard_data)

    选择器键实例定义如下:

    1abstractmethod register(fileobj, events, data=None)

    因此,register方法将k.data设置为我们的回调函数got_keyboard_data,并在按下Enter键时调用它:

    1

    2callback = k.data

    callback(k.fileobj)

    一个更完整的示例(希望更有用)是将来自用户的标准输入数据与来自网络的传入连接进行复用:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    40

    41

    42

    43

    44

    45

    46

    47

    48

    49

    50

    51

    52

    53

    54

    55

    56

    57

    58

    59

    60

    61

    62

    63

    64

    65

    66

    67

    68

    69

    70

    71

    72

    73

    74

    75

    76import selectors

    import socket

    import sys

    import os

    import fcntl

    m_selector = selectors.DefaultSelector()

    # set sys.stdin non-blocking

    def set_input_nonblocking():

    orig_fl = fcntl.fcntl(sys.stdin, fcntl.F_GETFL)

    fcntl.fcntl(sys.stdin, fcntl.F_SETFL, orig_fl | os.O_NONBLOCK)

    def create_socket(port, max_conn):

    server_addr = ('localhost', port)

    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

    server.setblocking(False)

    server.bind(server_addr)

    server.listen(max_conn)

    return server

    def read(conn, mask):

    global GO_ON

    client_address = conn.getpeername()

    data = conn.recv(1024)

    print('Got {} from {}'.format(data, client_address))

    if not data:

    GO_ON = False

    def accept(sock, mask):

    new_conn, addr = sock.accept()

    new_conn.setblocking(False)

    print('Accepting connection from {}'.format(addr))

    m_selector.register(new_conn, selectors.EVENT_READ, read)

    def quit():

    global GO_ON

    print('Exiting...')

    GO_ON = False

    def from_keyboard(arg1, arg2):

    line = arg1.read()

    if line == 'quit

    ':

    quit()

    else:

    print('User input: {}'.format(line))

    GO_ON = True

    set_input_nonblocking()

    # listen to port 10000, at most 10 connections

    server = create_socket(10000, 10)

    m_selector.register(server, selectors.EVENT_READ, accept)

    m_selector.register(sys.stdin, selectors.EVENT_READ, from_keyboard)

    while GO_ON:

    sys.stdout.write('>>> ')

    sys.stdout.flush()

    for k, mask in m_selector.select():

    callback = k.data

    callback(k.fileobj, mask)

    # unregister events

    m_selector.unregister(sys.stdin)

    # close connection

    server.shutdown()

    server.close()

    # close select

    m_selector.close()

    您可以使用两个终端进行测试。

    第一航站楼:

    1

    2$ python3 test.py

    >>> bla

    打开另一个终端并运行:

    1

    2$ nc localhost 10000

    hey!

    回到第一

    1>>> qwerqwer

    结果(在主终端上看到):

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11$ python3 test.py

    >>> bla

    User input: bla

    >>> Accepting connection from ('127.0.0.1', 39598)

    >>> Got b'hey!

    ' from ('127.0.0.1', 39598)

    >>> qwerqwer

    User input: qwerqwer

    >>>

    请在您的帖子中添加说明,以便将来的访问者清楚易懂

    我可以建议nobreak吗?如果不是,您愿意使用诅咒。

    https://docs.python.org/3/library/curses.html#curses.window.nodelay

    使用发电机-幸运的是sys.stdin已经是发电机!

    生成器使您可以处理无限流。始终在调用它时会返回下一个元素。为了构建生成器,您需要yield关键字。

    1

    2

    3

    4

    5for line in sys.stdin:

    print line

    if a_certain_situation_happens:

    break

    如果发生某些希望的情况,请不要忘记在循环中放置break语句。

    您可以在以下位置找到有关生成器的更多信息:

    http://www.dabeaz.com/generators/index.html

    http://linuxgazette.net/100/pramode.html

    阿伦特还有其他因素在起作用吗? 例如流是行缓冲还是块缓冲?

    sys.stdin已经是一个生成器,因此您可以执行for line in sys.stdin: ...或使用更新的fileinput模块。 两者都不是非阻塞的。

    展开全文
  • 创建此API是为了包含MVC API的与STDIN类型不相关的部分(控制台,URL请求或要处理的异常)。 它为以下各项奠定了基础: :STDIN来自URL请求 :STDIN来自URL /控制台请求的STDERR 控制台MVC API(有待完成):...
  • 一个简单的命令行实用程序,将您的stdin发送到工作表。 通过pip install tosheets在pip上可用(仅适用于python3 +) 注意:首次使用时,tosheets将打开浏览器窗口以授权OAuth2令牌。 使用tosheets 用管道将本地...
  • tubesock:STDIN转WebSocket

    2021-05-02 12:18:26
    Tubesock是一个小实用程序,可将STDIN通过管道传递到WebSocket(并再次返回)。 安装 $ npm install -g tubesock 使用范例 将随机数传送到tubesock : $ while true ; do ruby -e " puts rand(30) + 50 " ; ...
  • tmpin - 添加stdin支持至任何CLI应用程序接受文件输入
  • python中stdin是什么

    千次阅读 2021-03-17 02:24:32
    python如何判断stdin里面是否有数据解决方案: select,poll等监视标准输入文件句柄(0),一旦有I/O操作就打印数据 使用sys.stdin.isatty()函数 import sys def check_method_1(): import select if select.select([sys...
  • # stdin 像是 while readline() # 会自动结束程序 (在acwing 1295) for x in stdin: # do something # 如果用stdin.readline()必须手动判断是否结束 while True: x = stdin.readline().strip('\n') if not x:...
  • 图表STDIN博客文章的快速智能图表。通过示例学习! 备忘单语法图表[选项]饼图:呈现饼图条形图:呈现条形图线:呈现折线图散点图:STDIN Blogpost的快速智能图表通过示例学习! 备忘单语法图表[选项]饼图:绘制饼图...
  • 什么是Linux上的stdin,stdout和stderr?

    千次阅读 2020-09-18 03:57:44
    Fatmawati Achmad Zaenuri/Shutterstock.comFatmawati Achmad Zaenuri / Shutterstock.com stdin, stdout, and stderr are three data streams created when you launch a Linux command. You can use them to tell ...
  • 在unix系统调用中,标准输入描述字用stdin,标准输出用stdout,标准出错用stderr表示,但在一些调用函数,引用了STDIN_FILENO表示标准输入才,同样,标准出入用STDOUT_FILENO,标准出错用STDERR_FILENO.他们的区别:stdin等...
  • stdin 由标准C库实现, STDIN_FILENO是指0号文件描述符是linux内核(类unix操作系统)专有概念 STDIN_FILENO与stdin的区别:  STDIN_FILENO:  1).数据类型:int  2).层次:系统级的API,是一个文件句柄,定义在...
  • 如何清除stdin缓存中的数据?一。这问题没有什么很标准的做法:方法1、fflush():VC上面使用fflush()可以成功, 而在gcc上面使用fflush()却不能成功。方法2、setbuf():虽然在gcc上面,使用这种方式确实可以清空输入流....
  • 在学习到C语言的缓冲区的时候,本来是一切顺利的,结果看到了说是stdin、stdout、stderr三个标准流是一个文件指针,可以当作像普通文件指针fp那样进行函数的操作,这让我想起了有关文件指针相关的fgetc、fputc、...
  • 关于stdin和stdout

    2022-03-06 08:26:00
    stdin是标准输入流,可以理解为键盘 stdout是标准输出流,可以理解是屏幕 结果:从键盘上输入get,从屏幕输出get 等同于大家熟悉的gets和puts

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 547,353
精华内容 218,941
关键字:

stdin