Как передать строку через STDIN в терминальную команду, выполняемую в скрипте Python?

Мне нужно сгенерировать схему Postgres из кадра данных. Я обнаружил, что библиотека csvkit подходит к соответствующим типам данных. Я могу запустить csvkit и сгенерировать схему postgres через csv на своем рабочем столе через терминал с помощью этой команды, найденной в docs:

csvsql -i postgresql myFile.csv 

csvkit docs - 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()

заранее спасибо

1 ответ

Решение

Вы не можете передать такую ​​большую строку через командную строку! Вы должны сохранить данные в файл и передать его путь к 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")
Другие вопросы по тегам