如何向另一个Python进程的标准输入(STDIN)写入内容?

4

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

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

然后,在代码的其他部分,它继续监听其 STDIN

此进程会输出以下内容:

Process id: 3824

我想从另一个Python进程中,通过给定的PID向上述进程的STDIN写入内容。

我的问题是:我需要在第二个进程中编写什么代码来实现这一点?

我正在使用Windows操作系统。


https://docs.python.org/3/library/ipc.html - cs95
@cᴏʟᴅsᴘᴇᴇᴅ,你能具体一点吗?谢谢。 - Angel
看看子进程模块以及控制子进程输入和输出的方法。然后提出一个更精确的问题。 - Serge Ballesta
@CoryMadden,那个示例是针对Linux的,并且没有使用进程的PID。我需要在Windows上使用进程的PID的代码。 - Angel
抱歉,我承认我对Windows不是很了解。 - Cory Madden
2个回答

2
一个程序只能重定向它创建的进程(“子进程”)的标准输入和输出。要使用标准输出与另一个进程通信,该进程必须已经在监听你了。
操作系统控制进程的文件描述符指向什么。也就是说,你的进程的stdin将由操作系统和程序执行的上下文确定。为了允许进程间通信,你可以查看操作系统提供的相关功能,例如使用shell脚本和管道运算符
你需要的是一个命名管道,它基本上是一个类似文件的对象,你可以从中写入和读取,并且作为进程之间的桥梁。不幸的是,Python在Windows上似乎没有对此提供“本地”支持。你需要Python for Windows扩展来实现。
或者,你可以使用套接字

命名管道由multiprocessing模块通过connection.Listenerconnection.Client支持。multiprocessing中的其他函数隐式地使用命名管道,但这些函数允许您显式设置名称/地址,例如r'\\.\PIPE\spam' - Eryk Sun
回答这个问题需要调用 AttachConsoleWriteConsoleInput,假设进程正在使用控制台作为其标准输入。但这不是一个正常的方法,特别是如果您对服务器和客户端的源代码有控制权。 - Eryk Sun

0

不要直接写入 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的惩罚吗? - Verthais

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接