如何在Python中创建新的控制台会话并使用它们

时间:2014-08-14 20:21:52

标签: python bash python-2.7 terminal subprocess

我正在试图弄清楚如何在Python中使用控制台。比方说,我有一个Python2脚本。此脚本应创建3个控制台(bash或任何其他控制台),并为它们提供不同的命令。

示例:

  • 控制台#1将负责远程登录
  • 用于ping的控制台#2
  • 控制台#3将负责新的ssh访问

到目前为止我发现的是 subprocess 模块。

我可以用这个

import subprocess
term1 = subprocess.Popen(['open', '-a', 'Terminal'])

但我仍然无法找到如何向 term1

发送命令

谢谢。

2 个答案:

答案 0 :(得分:0)

如果您希望能够与子流程进行通信,则最好使用subprocess.popen

https://docs.python.org/2/library/subprocess.html#subprocess.Popen

这样你就可以创建一个stdin和stout来与进程通信。如上面的链接所示,您只需将它们添加到popen参数:

subprocess.Popen(args, stdin=PIPE, stdout=PIPE)

还有popen.communicate(input= 'your input')

那将等待命令完成。

答案 1 :(得分:0)

我在Linux上使用xterm测试过。可能适应MacOS X终端而没有太多问题......我希望。

关键的想法是从Python创建一个匿名管道,然后指示在终端模拟器内部运行的shell从该管道读取:

import os
output, input = os.pipe()
term = subprocess.Popen("xterm -e 'bash </dev/fd/{}'".format(output),shell=True)

f = os.fdopen(input,"wt")

# output as much as command as you want. `flush` between them ... to flush data
f.writelines("echo toto\n")
f.flush()

f.close()

在GUI终端仿真器上生成该输出:

toto

如果你想读写,你必须打开两个管道 - 但是如果你向一个方向填充管道,请注意死锁:

>>> import os
>>> output1, input1 = os.pipe()
>>> output2, input2 = os.pipe()
>>> term = subprocess.Popen("xterm -e 'bash </dev/fd/{} >/dev/fd/{}'".format(output1,input2),shell=True)
>>> 
>>> fin = os.fdopen(input1,"wt")
>>> fout = os.fdopen(output2,"rt")
>>> 
# FOR EXPERIMENTAL PURPOSE ONLY: SUBJECT TO DEAD-LOCK !!!
>>> fin.writelines("date\n")
>>> fin.flush()
>>> 
>>> print fout.readline()

Thu Aug 14 23:50:15 CEST 2014

>>> 
>>> fin.close()
>>> fout.close()

话虽如此,在该配置中,打开终端的唯一兴趣是在GUI显示器上显示潜在的 stderr 输出。

如果您只需要与底层命令(bash,ping,...)进行通信,那么您根本不需要终端,只需连接到相应的子进程标准I / O,如其他答案中所述。