【问题标题】:passing pandas dataframe into a python subprocess.Popen as an argument将 pandas 数据框作为参数传递到 python subprocess.Popen
【发布时间】:2018-01-11 10:27:58
【问题描述】:

我正在尝试从主脚本调用 python 脚本。我只需要从主脚本中生成一个数据帧,然后将其作为要在子进程中使用的参数传递给子进程脚本。

以下是我尝试编写所需的 python 主脚本。

from subprocess import PIPE, Popen
import pandas as pd

test_dataframe = pd.read_excel(r'C:\test_location\file.xlsx',sheetname='Table')

sp = Popen(["python.exe",'C:/capture/test.py'], shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE)
sp.communicate(test_dataframe)

这是错误: TypeError: argument 1 must be convertible to a buffer, not DataFrame

这是我第一次尝试使用 subprocess 模块,所以我还不是很擅长。任何帮助将不胜感激。

【问题讨论】:

    标签: python pandas dataframe subprocess


    【解决方案1】:

    子进程启动另一个应用程序。进程之间的通信方式与 Python 程序中函数的通信方式有很大不同。您需要通过非 Pythonic 环境传递 DataFrame。因此,您需要将其序列化为文本,然后在另一端反序列化。例如,您可以使用pickle 模块,然后在一端使用sp.communicate(pickle.dumps(test_dataframe)),在另一端使用pickle.loads(sys.stdin.read())。或者您可以将 DataFrame 编写为 csv,然后再次解析。或者您可以使用任何其他格式。

    【讨论】:

    • 嗨,亚历克斯,感谢您的回复。我尝试使用pickle,但在完成主脚本后,它会自行关闭而没有给出任何错误,并且根本没有运行来自子进程脚本的命令。
    • 你确定,那个子进程没有被执行?可能是它被执行了,但你不检查它是否已经成功完成?还要检查进程的输出,它由sp.comminucate 返回。除此之外,检查shell=True 的作用。您将命令作为数组传递,但还要指定 shell=True
    • 我的子进程以打印命令开始并以 raw_input() 结束,以便我查看它是否运行,弹出窗口在自行关闭之前不显示任何内容。我尝试使用和不使用 shell,无论哪种方式,我都没有从子进程中得到任何东西。我尝试在没有标准输入、标准输出和标准错误的情况下运行,然后子进程的第一个打印命令运行但永远挂在 pickle.loads(sys.stdin.read())。
    【解决方案2】:

    这是 Python 3.6 主脚本和子进程之间双向通信的完整示例。

    ma​​ster.py

    import pandas as pd
    import pickle
    import subprocess
    
    df = pd.read_excel(r'C:\test_location\file.xlsx',sheetname='Table')
    
    result = subprocess.run(['python', 'call_model.py'], input=pickle.dumps(df), stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    returned_df = pickle.loads(result.stdout)
    assert df == returned_df
    

    如果有问题可以查看result.stderr

    subroutine.py

    import pickle
    import sys
    
    data = pickle.loads(sys.stdin.buffer.read())
    sys.stdout.buffer.write(pickle.dumps(data))
    

    【讨论】:

      猜你喜欢
      • 2014-02-13
      • 2017-02-18
      • 1970-01-01
      • 1970-01-01
      • 2013-11-10
      • 2023-02-01
      • 2015-07-09
      • 2023-03-28
      • 1970-01-01
      相关资源
      最近更新 更多