【问题标题】:Output of interactive python to shell variable将交互式 python 输出到 shell 变量
【发布时间】:2021-01-07 01:59:37
【问题描述】:

有一个类似的交互式 python 脚本

def myfunc():
    print("enter value between 1 to 10")
    i=int(input())
    if(i<1 or i>10):
        print("again")
        myfunc()
    else:
        print(i)

我想将最终输出(print(i))存储在 shell 变量中。类似的东西

python myFile.py | read a

每次我运行命令时,上面的查询都会卡住。有可能这样做吗? 即使( read b | python myFile.py ) | read a 违背了交互式 python 函数的目的,但这也不起作用。如果myfunc() 是非交互式的(不期望用户输入),它就可以工作。现实中的函数接受一些输入,对其进行操作,然后以所需格式输出结果。我知道使用 python 或 shell 会容易得多,但由于我已经编写了 python 函数,所以想知道是否可以链接两者。如果是,是否也可以只将最终值添加到 shell 变量而不是所有 print()

当我这样做时会发生同样的问题(终端卡住)

python myFile.py > someFilename

但是,即使终端没有响应,文件 someFilename 也已创建。似乎 shell 同时启动了这两个进程,这是有道理的。我猜如果python myfile.py 在打开管道之前以某种方式独立执行,这可能是可能的,但我可能错了。

【问题讨论】:

    标签: python


    【解决方案1】:

    如果您正在使用 Linux 或其他 Unix 变体,请尝试一下:

    import os
    def myfunc():
        tty = os.open("/dev/tty", os.O_WRONLY)
        os.write(tty, "enter value between 1 to 10\n")
        i=int(input())
        if(i<1 or i>10):
            os.write(tty, "again\n")
            myfunc()
        else:
            print(i)
    

    顺便说一句,如果你的 shell 是bash,最好说:

    read a < <(python myFile.py)
    

    否则在子shell中调用read a和变量a 不能在以下代码中引用。

    【讨论】:

    • 这很好用。谢谢。一个后续的疑问。当我以python myfile.py 运行此函数时,它会引发错误,直到我将os.write 中的字符串部分更改为字节。我将它转换为字节,然后当我尝试从 shell 调用时,它抛出错误,说字符串是预期的。为什么会这样?
    • 感谢您的及时反馈。在将字符串更改为字节之前给出什么错误消息?在我的环境中,os.write(tty, "enter value between 1 to 10\n")os.write(tty, bytes("enter value between 1 to 10\n")) 都有效。
    • 以下是错误:os.write(tty, "enter value between 1 to 10\n") TypeError: a bytes-like object is required, not 'str'。 bytes 也不起作用 bytes("enter value between 1 to 10\n") 抛出错误 TypeError: string argument without an encoding 所以必须在 bytes 函数中添加 'utf-8' 参数
    • 我实际上是在 mac 而不是 linux 中尝试,这可能是原因吗?
    • 感谢您提供详细信息。它不会与 macOS 相关,而是取决于区域设置。所以你已经添加了 'utf-8' 参数,现在它可以工作了吗?
    猜你喜欢
    • 1970-01-01
    • 2011-09-13
    • 1970-01-01
    • 2013-05-06
    • 2016-02-17
    • 2017-07-04
    • 2020-12-01
    • 2017-04-06
    • 2020-06-24
    相关资源
    最近更新 更多