You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从子进程中获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:39:21