我一直在尝试编写一个基本的终端仿真脚本,因为出于某种原因我在我的 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/