Prøv ikke at bruge shell=True
hvis du kan undgå det. bedre at tokenize kommandoen selv for at hjælpe sh.
subprocess.call(["psql", "-U", "{user}", "-h", "{ip}", "-d", "{db}", "-w", "{pw}", "-c", "{copy statement}"])
I dette tilfælde kan din kopierklæring være, som den er overført til psql ordret, fordi der ikke er nogen shell citatproblemer at tage hensyn til. (NB skal stadig citere dette for python, så strengen forbliver som den er).
Hvis du stadig vil bruge shell=True
så skal du undslippe strengen literal for både python og skal
"\"\copy table (col1, col2) FROM file_location CSV HEADER QUOTE '\\\"' NULL ''\""
vil oprette en streng i python, som vil være
"\copy table (col1, col2) FROM file_location CSV HEADER QUOTE '\"' NULL ''\"
Hvilket er, hvad vi fandt ud af, at vi havde brug for på vores shell i første omgang!
Rediger (forklarer noget fra kommentarerne):
subprocess.call
, når du ikke bruger shell=True
, tager en gentagelse af argumenter.
Så du kunne have
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)
Se https://docs.python.org/2/library/ subprocess.html#subprocess.call eller https://docs.python.org/3/library/ subprocess.html#subprocess.call
ekstra redigering:- Bemærk venligst, at for at undgå skalinjektion, skal du bruge metoden beskrevet her. Se advarselsafsnittet på https://docs.python. org/2/library/subprocess.html#frequently-used-arguments