python - 在 Python 中使用 exec() 时如何传递套接字变量?
问题描述
我有一个程序版本 A,它调用 execve() 来执行另一个程序版本 B,同时保留相同的 PID。
这个程序 A 有一个套接字对象,我们希望另一个程序 B 访问同一个套接字以向已建立的连接发送一些数据。
问题是我还没有找到成功恢复序列化套接字的方法,我将它保存到一个文件中,在新程序 B 中再次打开该文件但它不是同一个对象,未初始化并且没有有任何属性集,我用过莳萝和泡菜。
调用 exec() 时是否有安全的方法来传递变量对象?或者一种获取对象的指针引用并将该指针向前传递的方法?
版本 A:
#!/bin/env python
import os
import dill as pickle
import socket
print "Version A"
print os.getpid()
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("127.0.0.1",80))
with open('file1.pickle', 'wb') as handle:
pickle.dump(s, handle)
os.execlp('python', 'python', 'verB.py')
版本 B:
#!/bin/env python
import os,pdb,sys
import dill as pickle
import socket
print "Version B"
print os.getpid()
infile = open('file1.pickle','rb')
infile.seek(0, 0)
s = pickle.load(infile)
infile.close()
s.send("mymessage")
s.close()
B版sockets
未初始化,如何恢复socket?
解决方案
在类 Unix 系统上execve
,程序保留未标记的打开文件描述符FD_CLOEXEC
。您需要将文件描述符(一个小整数)传递给新进程。默认情况下,Python 将文件描述符设置为 close-on-exec,因此如果您的父进程是 python 进程,则需要专门更改该标志。您可以将套接字 fd 写入文件:
open("file1.txt", "w").write(str(s.fileno()))
但更常见的是,要么在命令行上传递它,要么将它塞进环境中。作为 python 调用 python 并在命令行上传递套接字的示例:
verA.py
import socket
import os
import sys
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(("stackoverflow.com", 80))
os.set_inheritable(sock.fileno(), True)
os.execlp(sys.executable, "python", "verB.py", str(sock.fileno()))
动词.py
import socket
import sys
sock = socket.fromfd(int(sys.argv[1]), socket.AF_INET, socket.SOCK_STREAM)
sock.send(b"GET / HTTP/1.1\r\nHost:stackoverflow.com\r\n\r\n")
print(sock.recv(500))
推荐阅读
- excel - 从 DOCX4j 中的 xml 中删除不必要的命名空间
- python - 为什么这不是选择排序算法
- node.js - 将 passportjs 的新 OAuthStrategy() 用于 twitter 的 3-legged-auth 时,我无法进入验证回调
- java - 计算 H2 数据库中的重复行
- javascript - 如何使用 javascript 在表单中提交数据
- python - 根据第一个元素长度递归地将列表拆分为子列表
- javascript - 合并具有相同值且位于同一行的 HTML 表格单元格
- twitter - Twitter 使用 WOE_ID 为 24 个城镇中的每个城镇返回了相同的印度热门话题
- git - Git 子模块在 Jenkins 中构建,显示自上次构建以来子模块的更改
- ssl - 将 Zscaler 证书安装到 Anaconda3