【问题标题】:Open command prompt in the background [closed]在后台打开命令提示符[关闭]
【发布时间】:2013-07-16 00:40:02
【问题描述】:

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

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

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

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

所以,如果有任何想法对我有帮助的话。

谢谢各位。

【问题讨论】:

  • 不要只说“我试过了”,告诉我们你尝试了什么,结果如何。同时:打开命令提示符或任何其他程序的方法是subprocess 模块。如果你想控制输入和输出,而不是让它与你自己的输入和输出混合,关键是subprocess.PIPE。在后台做某事的方法是threading 模块。这应该就是你在这里所需要的。只需告诉我们您遇到的问题。
  • 哦,当然,老兄,基本逻辑是,我想创建一个python程序,然后将连接或绑定到命令提示符,所以我可以给它命令,子进程工作,但是命令提示符在之后退出输入一个命令左右,我希望同一个实例在我想要的时间内工作。我计划在 1 时开始执行以下导入子进程命令提示:a = 输入命令 process.stdin.write(a+"\n")communicate() if a == ' ':退出命令提示符谢谢
  • 是的,communicate 只发送一大块输入并取回一大块输出。您需要自己实际使用读写PIPEs。

标签: python


【解决方案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 对象本身上wait 的第四个线程。

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

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

【讨论】:

  • 谢谢老兄,有帮助,我也会检查一下pexpect。
【解决方案2】:

好的,现在我想起来了。保持子进程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

关于这个帖子,Keeping a pipe to a process open

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

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

【讨论】:

  • 这仅适用于您只需要来自process.stdout 的单行响应(或者,确切地知道您应该需要多少行)。否则,你必须一直调用read 直到你阻塞……此时你被阻塞,你的整个程序被卡住了。您无法以可移植的方式使用select 解决此问题,因此唯一真正的选择是线程。这就是为什么在 Python 3.2+ 中,communicate 使用线程。
  • 感谢您的帮助
  • 特别是,如果'whatever''sh''cmd',而您正在写入的内容是任意命令,那么您不可能知道要读取多少作为响应。
猜你喜欢
  • 2015-01-26
  • 2018-06-06
  • 1970-01-01
  • 1970-01-01
  • 2022-06-20
  • 2014-12-08
  • 2014-04-10
  • 2023-03-05
  • 1970-01-01
相关资源
最近更新 更多