【问题标题】:How to write to the STDIN of another Python process? [duplicate]如何写入另一个 Python 进程的 STDIN? [复制]
【发布时间】:2018-01-21 06:59:34
【问题描述】:

我有一个 Python 程序,其代码包含以下片段:

def Main():
    pid = os.getpid()
    print 'Process id: {}'.format(pid)

然后,在代码的其他部分,它一直在其 STDIN 上侦听。

此过程输出以下内容:

Process id: 3824

鉴于其 PID,我想从另一个 Python 进程写入上述进程的 STDIN

我的问题是:我需要从第二个过程中执行什么代码?

我正在使用 Windows

【问题讨论】:

  • @cᴏʟᴅsᴘᴇᴇᴅ,你能说得具体一点吗?谢谢
  • 查看子流程模块以及控制子流程输入输出的方式。然后问一个更精确的问题。
  • @CoryMadden,该示例适用于 Linux,不使用进程的 PID。我需要 Windows 的代码并使用进程的 PID
  • 抱歉,我承认我对 Windows 不太了解。

标签: python python-2.7 process stdout stdin


【解决方案1】:

使用队列在进程之间进行通信,而不是写入 STDIN from multiprocessing import Process, Queue

def f(q):
    q.put([42, None, 'hello'])

q = Queue()
p1 = Process(target=f, args=(q,))
p1 = Process(target=f, args=(q,))
# start and join

在另一个进程中做

print(q.get())    # prints "[42, None, 'hello']"

【讨论】:

  • 这种方式不会因为q是共享的而受到GIL的惩罚吗?
【解决方案2】:

程序只能重定向它创建的进程(“子进程”)的标准输入和输出。要使用标准输出与另一个进程通信,该进程必须已经在监听您。

控制进程的文件描述符所指内容的是操作系统。也就是说,您的进程的stdin 将由操作系统和程序执行的上下文确定。要允许进程间通信,您可以查看操作系统为此提供的工具,例如using a shell script and the piping operator

你想要的是一个命名管道,它基本上是一个类似文件的对象,你可以从中读写,它充当进程之间的桥梁。不幸的是,python 在 Windows 上似乎没有“本机”支持。为此,您需要 python for windows extension

或者,您可以使用socket

【讨论】:

  • 命名管道由multiprocessing module 通过connection.Listenerconnection.Client 支持。多处理中的其他函数隐式使用命名管道,但这些允许您显式设置名称/地址,例如r'\\.\PIPE\spam'.
  • 回答提出的问题将涉及调用AttachConsoleWriteConsoleInput,假设进程使用控制台作为其标准输入。但这不是一种正常的方法,特别是如果您可以控制服务器和客户端的源。
猜你喜欢
  • 2015-12-02
  • 2012-11-19
  • 1970-01-01
  • 2013-01-05
  • 1970-01-01
  • 1970-01-01
  • 2016-06-16
  • 2017-02-09
  • 2011-06-05
相关资源
最近更新 更多