如何通过 STDIN 将字符串传递到在 python 脚本中执行的终端命令中?

How to pass string via STDIN into terminal command being executed within python script?

我需要从数据框生成 postgres 架构。我发现 csvkit 库最接近匹配的数据类型。我可以 运行 csvkit 并通过终端通过文档中的此命令在我的桌面上的 csv 上生成 postgres 模式:

csvsql -i postgresql myFile.csv 

csvkit 文档 - https://csvkit.readthedocs.io/en/stable/scripts/csvsql.html

而且我可以 运行 通过以下代码在我的脚本中使用终端命令:

import os
a=os.popen("csvsql -i postgresql Desktop/myFile.csv").read()

但是我有一个数据框,我已经将其转换为 csv 字符串并且需要从字符串生成架构,如下所示:

csvstr = df.to_csv()

在文档中它说在位置参数下:

The CSV file(s) to operate on. If omitted, will accept
                        input on STDIN

如何将变量 csvstr 作为变量传递到代码行 a=os.popen("csvsql -i postgresql csvstr").read() 中?

我尝试执行以下代码行但出现错误 OSError: [Errno 7] Argument list too long: '/bin/sh'

a=os.popen("csvsql -i postgresql {}".format(csvstr)).read()

提前致谢

你不能通过命令行传递这么大的字符串!您必须将数据保存到文件并将其路径传递给 csvsql.

import csv

csvstr = df.to_csv()
with open('my_cool_df.csv', 'w', newline='') as csvfile:
    csvwriter= csv.writer(csvfile)
    csvwriter.writerows(csvstr)

及之后:

a=os.popen("csvsql -i postgresql my_cool_df.csv")