-1

需要帮助,所以我想做的是:-

我想设置一个python程序,它将在后台打开命令提示符,我将能够将命令作为输入提供给python程序,然后它将命令转发到命令提示符并给我输出,我希望建立这个连接在我想要的时间里,

我已经通过了一些python代码,其中发生的情况是,当我输入命令时,它会立即显示结果然后退出,我不希望该命令提示符实例退出直到我想要,所以我可以进行更改,更改目录等。

我试过了,但没有这样的结果:(。

因此,如果有任何想法确实可以帮助我。

伙计们。

4

2 回答 2

1

如果您想使用 执行此操作subprocess,请执行以下操作:

p = subprocess.Popen(['sh'], stdin=subprocess.PIPE, stdout=subprocess.PIPE)

现在,每次你想发送一个命令,你都必须对p.stdin.write()这个命令。你必须p.stdout.read()得到结果。

但那些是阻塞呼叫。所以,你可能想要的是:

  • 一个阅读器线程,循环p.stdout.read()并发布到queue.Queue
  • 一个编写线程,在​​不同的线程上循环queue.Queue并执行p.stdin.write().
  • 通过队列处理用户输入和输出的主线程。
  • 可能是对象本身的第四个wait线程Popen

这并不容易,但源代码communicate将向您展示如何做到这一点。(请务必阅读 3.2 或更高版本,因为早期版本实际上并没有做到这一点。)

如果您想要更简单的东西,请使用更高级别的库,例如pexpectPyPI 上的十几个 shell 包装器中的任何一个。

于 2013-07-16T01:41:43.407 回答
0

好的,现在我想起来了。保持子进程shell打开的方法是保持stdin PIPE打开

from subprocess import Popen, PIPE

process = Popen(['whatever'], stdin=PIPE, stdout=PIPE,shell=True)
process.stdin.write('Hello\n')
print repr(process.stdout.readline()) 
process.stdin.write('World\n')
print repr(process.stdout.readline()) 

#close
process.stdin.close()
process.wait()

但不推荐,也不可靠。使用pexpect(非 Windows)和 Windows 使用winpexpect.

参考此线程,保持通往进程的管道处于打开状态

也看看这个问题,Using module 'subprocess' with timeout

也看看这个来自activestate的代码,http: //code.activestate.com/recipes/576911-keep-a-process-up-and-running/

于 2013-07-16T01:34:14.733 回答