我正在试图弄清楚如何在Python中使用控制台。比方说,我有一个Python2脚本。此脚本应创建3个控制台(bash或任何其他控制台),并为它们提供不同的命令。
示例:
到目前为止我发现的是 subprocess 模块。
我可以用这个
import subprocess
term1 = subprocess.Popen(['open', '-a', 'Terminal'])
但我仍然无法找到如何向 term1
发送命令谢谢。
答案 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终端仿真器上生成该输出:
如果你想读写,你必须打开两个管道 - 但是如果你向一个方向填充管道,请注意死锁:
>>> 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,如其他答案中所述。