【问题标题】:Bash prompt not showing with custom Python terminal自定义 Python 终端未显示 Bash 提示
【发布时间】:2018-01-15 03:15:50
【问题描述】:

我正在用 Python(在 Ubuntu 中)编写一个终端程序,并且与 Bash 的通信运行良好。
我使用以下命令打开通往 Bash 的管道:

self.process = subprocess.Popen(['/bin/bash'], shell=False, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

我有单独的线程来处理标准输出和标准错误数据,我可以向标准输入发送命令。我唯一无法工作的是,当命令完成时,我会收到来自 Bash 的命令提示符。

例如,如果我在 Ubuntu 终端中列出目录内容,则输出为:
cyw@cyw-VirtualBox:~/testdir$ ls -l
共 0
-rw-rw-r-- 1 cyw cyw 0 Dec 1 15:55 file1
-rw-rw-r-- 1 cyw cyw 0 Dec 1 15:55 file2
-rw-rw-r-- 1 cyw cyw 0 Dec 1 15:55 file3
cyw@cyw-VirtualBox:~/testdir
$

我的 Python 终端中的相同输出如下所示:
ls -l
-rw-rw-r-- 1 cyw cyw 0 Dec 1 15:55 file1
-rw-rw-r-- 1 cyw cyw 0 Dec 1 15:55 file2
-rw-rw-r-- 1 cyw cyw 0 Dec 1 15:55 file3

我在 Google 上的所有搜索大多建议编辑 $PS1 变量,但我认为这不是这里的问题。如果没有命令提示符,我的终端将很难使用。任何帮助将不胜感激。

【问题讨论】:

  • 不!不要为此碰$PS1:-D 您必须了解subprocess 会生成一个运行某些命令的进程,但它不会像您在登录计算机时看到的那样为您提供常规终端。不像您的常规终端那样真正“等待”输入用户输入(stdin 也不是真的那样工作)

标签: python linux bash shell


【解决方案1】:

您的 bash 不是交互式的。

来自bash(1)

提示

交互执行时,bash 在准备好读取命令时显示主要提示 PS1

调用

<...> 交互式 shell 启动时不带非选项参数且不带 -c 选项,其标准输入和错误都连接到终端(由 isatty(3) 确定),或者以-i 选项。

【讨论】:

  • 谢谢,您的回答为我指明了正确的方向。我尝试使用 -i 选项使 shell 交互: self.process = subprocess.Popen(['/bin/bash', '-i'], shell=False ......现在当我运行程序时向我发送以下内容:“bash:此 shell 中没有作业控制”,然后它仍然不是交互式的。您还有什么建议吗?
  • stackoverflow.com/questions/11821378/… 解释了原因。我不知道如何修复这个自动取款机。问另一个问题,因为这超出了这个问题的范围。
  • 我对此进行了测试并得到了很好的提示,只是它是默认的$,并带有错误消息inappropriate ioctl for deviceno job control in this shell
【解决方案2】:

在 PS1 的交互模式下运行 bash:

  p = Popen(["/bin/bash","--norc","--noprofile","-i"], shell = False,
        stdin = PIPE, stdout = PIPE, stderr = STDOUT,
        bufsize = 1,
        env={"PS1":"\\u:\\h "},
        preexec_fn=os.setsid)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 2014-09-08
    • 1970-01-01
    • 2021-04-16
    • 1970-01-01
    相关资源
    最近更新 更多