English 中文(简体)
将封隔写入到 stddout
原标题:Blocking writing to stdout
  • 时间:2012-05-25 09:53:09
  •  标签:
  • python
  • ipc

我正撰写一个使用子处理程序的 Python 脚本。 主要的想法是让一个父脚本运行专门的子脚本, 例如运行其他程序或自行做一些事情。 在父脚本和子过程之间有管道。 我用它们来控制子进程是否仍然在响应, 定期发送一些字符并检查响应。 问题是当子程序在屏幕上打印任何东西( 即 写给 stdout 或 stderr ), 管子被破碎, 以及一切崩溃。 因此我的主要问题是, 能否在子过程中屏蔽对 std* 的写作, 所以只有对管道的正确回应是可能的? 我已经尝试了 < a href=" https:// stackoverflow. com/ questions/ 10321671/ stop- a- comple- from- write- to- stdout > > > > > > 阻止一个函数从写到 stdout 但没有成功 。

另外,欢迎在父进程和子进程之间交流的其他想法(基于文件的管道除外),但必须使用子进程。

问题回答

我强烈认为,你不必接受子进程在屏幕上打印任何东西(例如写给Stdout或Stderr)时,管子断了,所有东西都崩溃了,。你可以解决这个问题。然后,你不必“阻止”子进程从写作到标准流。

适当使用子进程模块的所有功率。 首先,连接 子进程。 PIPE 到子进程的标准流 :

p = subprocess.Popen(
        [executable, arg1, arg2],
        stdin=subprocess.PIPE,
        stdout=subprocess.PIPE,
        stderr=subprocess.PIPE)

运行子进程并通过这些管道与它互动:

stdout, stderr = p.communicate(stdin="command")

如果 communicate () () < /code > 不够灵活( 如果您需要同时监测多个子进程和/ 或如果某个子程序的 stdin 数据取决于对上一个命令的输出), 您可以直接与 p.stdout p.stderr p.stdin 属性互动。 在这种情况下, 您可能不得不建立自己的监测循环, 并使用 p.poll () 和/ 或 < codep>. returncode 。 控制子进程也可以通过 .send_ ignal () 实现。

您可以通过一个函数到 子进程。 Popen 执行请求程序前执行的函数 :

def close_std():
    os.close(0)
    os.close(1)
    os.close(2)

p = subprocess.Popen(cmd, preexec_fn=close_std)

请注意使用低级别 os.close ;关闭 syss.std/code> 只会在前置 Python 程序中产生效果。 另外,请注意,如果您的辅助程序是 Python 脚本, 当它们试图写入封闭文件描述符时, 它们可能会因例外而死亡 。





相关问题
Can Django models use MySQL functions?

Is there a way to force Django models to pass a field to a MySQL function every time the model data is read or loaded? To clarify what I mean in SQL, I want the Django model to produce something like ...

An enterprise scheduler for python (like quartz)

I am looking for an enterprise tasks scheduler for python, like quartz is for Java. Requirements: Persistent: if the process restarts or the machine restarts, then all the jobs must stay there and ...

How to remove unique, then duplicate dictionaries in a list?

Given the following list that contains some duplicate and some unique dictionaries, what is the best method to remove unique dictionaries first, then reduce the duplicate dictionaries to single ...

What is suggested seed value to use with random.seed()?

Simple enough question: I m using python random module to generate random integers. I want to know what is the suggested value to use with the random.seed() function? Currently I am letting this ...

How can I make the PyDev editor selectively ignore errors?

I m using PyDev under Eclipse to write some Jython code. I ve got numerous instances where I need to do something like this: import com.work.project.component.client.Interface.ISubInterface as ...

How do I profile `paster serve` s startup time?

Python s paster serve app.ini is taking longer than I would like to be ready for the first request. I know how to profile requests with middleware, but how do I profile the initialization time? I ...

Pragmatically adding give-aways/freebies to an online store

Our business currently has an online store and recently we ve been offering free specials to our customers. Right now, we simply display the special and give the buyer a notice stating we will add the ...

Converting Dictionary to List? [duplicate]

I m trying to convert a Python dictionary into a Python list, in order to perform some calculations. #My dictionary dict = {} dict[ Capital ]="London" dict[ Food ]="Fish&Chips" dict[ 2012 ]="...