FrozenLove_G 2024-06-16 10:57 采纳率: 0%
浏览 4

python下subprocess.Popen执行交互式脚本

关于python下subprocess.Popen的一个问题。
subprocess.Popen(cmd, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
如果我有一个下面这样的shell脚本需要执行,
脚本名:kk.sh
脚本内容如下:
#!/bin/bash
read -p "please input any char:" keys
echo $keys

可以看到这个脚本需要键入字符,问题是如何通过那句python语句执行这个shell脚本文件,让用户可以输入那个字符呢?
这样写subprocess.Popen("./kk.sh", shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)发现不能输入。
有知道的同学帮忙看看,谢谢!

  • 写回答

2条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-06-16 10:57
    关注

    引自免费微信小程序:皆我百晓生

    要使用subprocess.Popen与一个需要用户输入的交互式脚本进行通信,你需要确保将标准输入(stdin)设置为管道,并且在Python代码中通过管道写入数据。以下是具体的步骤和示例代码:

    首先,定义你的shell脚本kk.sh如下:

    #!/bin/bash
    
    read -p "please input any char:" keys
    
    echo $keys
    

    然后,在Python中使用subprocess.Popen来执行这个脚本,并通过stdin管道发送输入。你需要使用communicate()方法来完成与子进程的通信。这里是一个示例代码片段:

    import subprocess
    
    # 脚本路径
    script_path = "./kk.sh"
    
    # 创建子进程
    with subprocess.Popen(script_path, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) as proc:
        # 向子进程的stdin管道写入数据
        output, _ = proc.communicate(input="your_input_character")
    
    # 输出子进程的返回结果
    print(output.strip())
    

    在这个例子中,“your_input_character”是你想要输入到交互式脚本中的字符。注意,为了确保数据正确传输,text=True参数被设置,这使得communicate()函数的input参数可以接受字符串而不是字节串。

    此外,communicate()函数会等待子进程结束并返回stdout和stderr的输出。因此,output变量将包含你的交互式脚本返回的输出,即你输入的字符。

    如果你的脚本需要更复杂的交互,例如多次读取输入,你可能需要创建一个循环,每次调用proc.stdin.write()proc.stdin.flush()来发送输入,然后使用proc.stdout.readline()proc.stdout.read()来读取输出。但是,对于单次输入的情况,上述代码应该足够了。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 6月16日

悬赏问题

  • ¥15 curl 命令调用正常,程序调用报 java.net.ConnectException: connection refused
  • ¥20 关于web前端如何播放二次加密m3u8视频的问题
  • ¥15 使用百度地图api 位置函数报错?
  • ¥15 metamask如何添加TRON自定义网络
  • ¥66 关于川崎机器人调速问题
  • ¥15 winFrom界面无法打开
  • ¥30 crossover21 ARM64版本安装软件问题
  • ¥15 mymetaobjecthandler没有进入
  • ¥15 mmo能不能做客户端怪物
  • ¥15 osm下载到arcgis出错