python - python 中的基本终端仿真

标签 python shell terminal blender

我一直在尝试编写一个基本的终端仿真脚本,因为出于某种原因我在我的 mac 上没有终端访问权限。但是要在 Blender 中编写游戏引擎脚本,控制台(通常在您启动 Blender 时使用的终端中打开)是至关重要的。
对于只做简单的事情,如删除、重命名等。我曾经使用 stream = os.popen(command) 执行命令,然后使用 print (stream.read())。这适用于大多数事情,但不适用于任何交互。
不久我发现了一种新方法:
sp = subprocess.Popen(["/bin/bash", "-i"], stdout = subprocess.PIPE, stdin = subprocess.PIPE, stderr = subprocess.PIPE) 然后 打印(sp.communicate(command.encode()))。那应该生成一个交互式 shell,我可以像终端一样使用它,不是吗?

但无论哪种方式,我都无法保持连接打开,使用最后一个示例,我可以调用一次 sp.communicate,得到以下输出(在本例中为“ls/”)和一些错误:
(b'Applications\n[...]usr\nvar\n', b'bash: 在此 shell 中没有作业控制\nbash-3.2$ ls/\nbash-3.2$ exit\n')。 第二次它给了我一个 ValueError: I/O operation on closed file. 有时(例如“ls”)我只会收到此错误:b'ls\nbash-3.2$ exit\n'

这是什么意思?我如何使用 python 模拟终端以允许我控制交互式 shell 或运行 blender 并与控制台通信?

最佳答案

假设您想要一个不断要求输入的交互式 shell,您可以尝试以下操作:

import subprocess
import re

while True:
    # prevents lots of python error output
    try:
        s = raw_input('> ')
    except:
        break

    # check if you should exit
    if s.strip().lower() == 'exit':
        break

    # try to run command
    try:
        cmd = subprocess.Popen(re.split(r'\s+', s), stdout=subprocess.PIPE)
        cmd_out = cmd.stdout.read()

        # Process output
        print cmd_out

    except OSError:
        print 'Invalid command'

关于python - python 中的基本终端仿真,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11634626/

相关文章:

python - 删除非常大的数据集上的重复项

shell - 如何修改 PS1 以在最右角显示时间?

shell - 有没有办法在 linux 的 conf 文件中将文本添加到字符串的末尾?

python - ptb_word_lm中batch_size的含义(tensorflow的LSTM模型)

python - 基于国家频率计数的彩色 map

python - 从 python 类调用函数时的语法困惑

linux - 警告 : Could not start program with arguments. 警告:执行格式错误

浏览器中 InterSystems Cache 的终端仿真

awk - 匹配 "/"一旦进入 awk

linux - 如何将 tcptrack 的输出保存到文本文件中