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

标签 python-3.x postgresql stdin csvkit

我需要从数据框生成 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")

关于python-3.x - 如何通过 STDIN 将字符串传递给在 python 脚本中执行的终端命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51348954/

相关文章:

python - 使用python打开.txt文件

python-3.x - autopep8 因 "failed to create process."而失败

Python参数语法错误: invalid syntax

postgresql - 复合数组类型作为 PostgreSQL 中的 OUTPUT 参数

sql - 获取SQL中子查询的结果

arrays - WHERE条件在循环中使用数组中的信息

windows - 如何终止标准输入?

python - 在同一 df 中的 df col 行中仅选择一个值,以获取不同 val 的计算结果,并且一次仅对一个股票代码进行计算 df

C - 使用 getchar 而不是 fgets 作为标准输入

c - 从C中的多个文件中读取字符