gpt4 book ai didi

python - 如何使用Unix Socket在ruby和Python之间进行通信

转载 作者:数据小太阳 更新时间:2023-10-29 08:32:58 34 4
gpt4 key购买 nike

我正在尝试在我的 ruby​​ 进程和 Python 进程之间进行一些通信;我想使用 UNIX 套接字。

目标: ruby 进程“fork 并执行”Python 进程。在 ruby​​ 进程中,创建一个 UNIX 套接字对,并将其传递给 Python。

ruby 代码 (p.rb):

require 'socket'

r_socket, p_socket = Socket.pair(:UNIX, :DGRAM, 0)

# I was hoping this file descriptor would be available in the child process
pid = Process.spawn('python', 'p.py', p_socket.fileno.to_s)

Process.waitpid(pid)

Python 代码(p.py):

import sys
import os
import socket

# get the file descriptor from command line
p_fd = int(sys.argv[1])

socket.fromfd(p_fd, socket.AF_UNIX, socket.SOCK_DGRAM)

# f_socket = os.fdopen(p_fd)
# os.write(p_fd, 'h')

命令行:

ruby p.rb

结果:

OSError: [Errno 9] Bad file descriptor

我希望 ruby​​ 进程将文件描述符传递给 python 进程,以便这两个进程可以使用这些套接字发送数据。

那么,我的问题:

1) 是否可以像上面那样在 ruby​​ 和 python 进程之间传递打开的文件描述符?

2) 如果我们可以在两个进程之间传递文件描述符,那么我的代码有什么问题。

最佳答案

你很接近,但 Ruby spawn 默认关闭任何文件描述符 > 2,除非你传递 :close_others => false 作为参数。请参阅文档:

http://apidock.com/ruby/Kernel/spawn

工作示例:

require 'socket'

r_socket, p_socket = Socket.pair(:UNIX, :DGRAM, 0)

pid = Process.spawn('python', 'p.py', p_socket.fileno.to_s,
{ :close_others => false })

# Close the python end (we're not using it on the Ruby side)
p_socket.close

# Wait for some data
puts r_socket.gets

# Wait for finish
Process.waitpid(pid)

python :

import sys
import socket

p_fd = int(sys.argv[1])
p_socket = socket.fromfd(p_fd, socket.AF_UNIX, socket.SOCK_DGRAM)

p_socket.send("Hello world\n")

测试:

> ruby p.rb
Hello world

关于python - 如何使用Unix Socket在ruby和Python之间进行通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14627809/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com