如何从子进程中获取pandas DataFrame?
嘿,这个场景我之前折腾过,子进程之间没法直接传递Python对象(比如pandas的DataFrame),得靠序列化+跨进程数据传输来解决,给你几个实用的方案:
方案1:JSON传递(兼容性首选)
JSON是跨Python版本兼容性最好的格式,pandas原生支持DataFrame和JSON的互转,适合大多数简单数据场景。
子进程脚本(LP.py,Python2.7)
把DataFrame转成JSON输出到标准输出:
import pandas as pd import sys def main(): # 这里替换成你的Data生成逻辑 Data = pd.DataFrame({'col1': [1, 2, 3], 'col2': ['a', 'b', 'c']}) # 将DataFrame转为JSON并输出到stdout Data.to_json(sys.stdout) if __name__ == "__main__": main()
父进程脚本(Python3)
调用子进程读取stdout的JSON,再转回DataFrame:
import subprocess import pandas as pd # 替换成你的Python2.7可执行文件路径 python2_path = "/usr/bin/python2.7" # 调用子进程并捕获输出 json_output = subprocess.check_output([python2_path, "LP.py"], text=True) # 将JSON解析为DataFrame data_from_child = pd.read_json(json_output) print("从子进程获取的DataFrame:") print(data_from_child)
注意:JSON对复杂数据类型(比如datetime、自定义对象)支持有限,如果你的DataFrame包含这类数据,需要额外处理格式转换。
方案2:Pickle序列化(支持复杂数据)
Pickle能保留pandas的大部分数据类型,但要注意Python2和3的Pickle版本兼容问题,需要指定合适的协议和编码。
子进程脚本(LP.py,Python2.7)
用协议2序列化DataFrame并输出到stdout:
import pandas as pd import sys import pickle def main(): Data = pd.DataFrame({'col1': [1, 2, 3], 'col2': ['a', 'b', 'c']}) # 使用协议2(兼容Python2和3)序列化DataFrame pickle.dump(Data, sys.stdout, protocol=2) if __name__ == "__main__": main()
父进程脚本(Python3)
读取字节流并加载Pickle数据,指定encoding='latin1'处理字符串兼容问题:
import subprocess import pandas as pd import pickle python2_path = "/usr/bin/python2.7" # 读取子进程输出的字节流 pickle_output = subprocess.check_output([python2_path, "LP.py"]) # 加载Pickle数据 data_from_child = pickle.loads(pickle_output, encoding='latin1') print("从子进程获取的DataFrame:") print(data_from_child)
注意:Pickle存在安全风险,如果子进程的脚本来源不可信,不要使用这个方案;另外如果你的DataFrame包含非常特殊的类型,可能还是会有兼容问题。
方案3:临时文件中转(适合大数据量)
如果你的DataFrame数据量很大,用stdout传递可能会有性能问题,这时可以用临时文件来中转序列化后的数据。
子进程脚本(LP.py,Python2.7)
接收父进程传递的临时文件路径,把序列化后的DataFrame写入文件:
import pandas as pd import pickle import sys def main(): Data = pd.DataFrame({'col1': [1, 2, 3], 'col2': ['a', 'b', 'c']}) # 获取父进程传递的临时文件路径 temp_file_path = sys.argv[1] # 序列化并写入临时文件 with open(temp_file_path, 'wb') as f: pickle.dump(Data, f, protocol=2) if __name__ == "__main__": main()
父进程脚本(Python3)
创建临时文件,传递路径给子进程,完成后读取文件并清理:
import subprocess import pandas as pd import pickle import tempfile import os python2_path = "/usr/bin/python2.7" # 创建临时文件(关闭后不自动删除) with tempfile.NamedTemporaryFile(delete=False) as temp_file: temp_file_path = temp_file.name try: # 调用子进程,传递临时文件路径 subprocess.run([python2_path, "LP.py", temp_file_path], check=True) # 读取临时文件中的DataFrame with open(temp_file_path, 'rb') as f: data_from_child = pickle.loads(f.read(), encoding='latin1') print("从子进程获取的DataFrame:") print(data_from_child) finally: # 清理临时文件 os.unlink(temp_file_path)
内容的提问来源于stack exchange,提问作者JimmyBuffet_Express
相关产品推荐
相关产品推荐

