【问题标题】:how to pass a value to running process in python如何在python中将值传递给正在运行的进程
【发布时间】:2012-06-14 01:14:11
【问题描述】:

我想将一些值传递给正在运行的进程,我该怎么做?

比如说我有一个worker.py,它有这个代码。

import os
import sys

def my_test():
    print " I am starting now"
    a = raw_input("Do you want to start ? ")[0].lower()
    if a == "y":
        print "Yes I am starting now"
my_test()

这个文件是一个可执行文件。我在那个文件中有另一个 python 文件,我正在使用命令来启动我的 worker.py。

status, message = commands.getstatusoutput ("/tmp/worker.py")

但由于 raw_input,命令无法进入下一个级别。

无论如何我可以通过命令或子进程将“y”传递给工作人员吗?

PS:我正在通过 pyqt gui 运行此命令。

提前致谢。

更新:

我终于找到了,这是我的解决方案,是的,它使用 pexpect。

我的问题的完全有效的解决方案。我希望它会在未来对其他人有所帮助:)

#!/usr/bin/python

import sys
import pexpect
import re
from PyQt4 import QtGui, QtCore


class Example(QtGui.QWidget):

    def __init__(self):
        super(Example, self).__init__()

        self.initUI()

    def initUI(self):

        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('Message box')
        qbtn = QtGui.QPushButton('Quit', self)
        qbtn.clicked.connect(self.spawnJob)
        self.qtxte = QtGui.QPlainTextEdit(self)
        qbtn.resize(qbtn.sizeHint())
        qbtn.move(260, 150)
        self.setGeometry(300, 300, 340, 200)
        self.setWindowTitle('Quit button')
        self.show()

    def spawnJob(self):
        self.child = pexpect.spawn ('/usr/local/bin/python /tmp/worker.py')
        a = self.child.expect ('Do you')
        if str(self.child.after) == 'Do you':
            self.test_one()

       before_msg = self.child.before
           self.qtxte.appendPlainText(before_msg)

       for ln in self.child.readlines():
           self.qtxte.appendPlainText(ln.rstrip())

    def test_one(self):

        reply = QtGui.QMessageBox.question(self, 'Message',
            "Are you sure to quit?", QtGui.QMessageBox.Yes |
            QtGui.QMessageBox.No, QtGui.QMessageBox.No)

        if reply == QtGui.QMessageBox.Yes:
            self.child.sendline ('y')
        else:
            self.child.kill(0)

def main():

    app = QtGui.QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

【问题讨论】:

  • 看看 pexpect (noah.org/wiki/pexpect)。
  • 谢谢,我会检查一下这个问题和一个快速的问题,我是否可以在任何时候使用 child.sendline 或者它应该在我创建对象时通过?
  • 我在 pexpect 中发现的唯一问题是在 sendline 之后我无法获取日志,也许我错了会有一些选项。

标签: python subprocess threadpool


【解决方案1】:

popen 呢?您可以使用它将内容传递给 stdin 上的进程。

或者,您可以尝试使用"yes | /tmp/worker.py" 之类的命令作为您的命令。 yes 只是将一堆 'y' 转储到其标准输出中,然后由 worker.py 拾取。

更简单的是,使用"echo y | /tmp/worker.py" 作为您的命令。我刚刚试了一下,对我来说效果很好。

【讨论】:

  • 谢谢,这个解决方案很酷,但问题是我不能总是“y”,如果用户不想继续这个过程,那么我想发送“n”到 process 。还有一个问题,我想向用户显示进程日志,然后他们可以选择“y”或“n”。
  • 哦,所以想法是流程执行一段时间,然后提出问题,您想将问题传递给用户吗?
  • 在子进程包中使用 Popen。文档在这里:docs.python.org/library/subprocess.html#subprocess.Popen。您可以启动 worker 并观察其 stdout 上的输出,然后在必要时询问用户是否要继续,并将 y 或 n 反馈回其 stdin。
  • 是的,你是对的,我想在一定程度上执行我的流程,然后询问你的下一步。我尝试使用 Popen 和 stdin,但我从未成功:(
  • “我从来没有成功”是什么意思?它允许您读取子进程的输出,并写入输入以表示是或否
猜你喜欢
  • 1970-01-01
  • 2011-10-08
  • 2012-09-01
  • 2018-10-09
  • 1970-01-01
  • 2011-09-04
  • 2012-06-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多