Опитайте се да не използвате shell=True
ако можете да го избегнете. по-добре сами да токенизирате командата, за да помогнете на sh.
subprocess.call(["psql", "-U", "{user}", "-h", "{ip}", "-d", "{db}", "-w", "{pw}", "-c", "{copy statement}"])
В този случай тогава вашият оператор за копиране може да бъде такъв, какъвто се предава на psql дословно, защото няма shell проблеми с цитирането, които трябва да се вземат предвид. (N.B. все още трябва да цитирам това за python, така че низът ще остане такъв, какъвто е).
Ако все пак искате да използвате shell=True
тогава трябва да екранирате низовия литерал както за python и обвивка
"\"\copy table (col1, col2) FROM file_location CSV HEADER QUOTE '\\\"' NULL ''\""
ще създаде низ в python, който ще бъде
"\copy table (col1, col2) FROM file_location CSV HEADER QUOTE '\"' NULL ''\"
Което открихме, че се нуждаем на първо място в нашата обвивка!
Редактиране (изяснявам нещо от коментарите):
subprocess.call
, когато не използвате shell=True
, приема повторение на аргументи.
Така че бихте могли да имате
psql_command = "\"\copy table (col1, col2) FROM file_location CSV HEADER QUOTE '\\\"' NULL ''\""
# user, hostname, password, dbname all defined elsewhere above.
command = ["psql",
"-U", user,
"-h", hostname,
"-d", dbname,
"-w", password,
"-c", psql_command,
]
subprocess.call(command)
Вижте https://docs.python.org/2/library/ subprocess.html#subprocess.call или https://docs.python.org/3/library/ subprocess.html#subprocess.call
допълнителна редакция :- Моля, обърнете внимание, че за да избегнете инжектиране на черупка, трябва да използвате метода, описан тук. Вижте раздела за предупреждения на https://docs.python. org/2/library/subprocess.html#frequently-used-arguments