Försök att inte använda shell=True
om du kan undvika det. bättre att symbolisera kommandot själv för att hjälpa sh.
subprocess.call(["psql", "-U", "{user}", "-h", "{ip}", "-d", "{db}", "-w", "{pw}", "-c", "{copy statement}"])
I det här fallet kan din kopia-sats vara så som den skickas till psql ordagrant, eftersom det inte finns något skal citatfrågor att ta hänsyn till. (Obs. måste fortfarande citera detta för python, så strängen skulle förbli som den är).
Om du fortfarande vill använda shell=True
då måste du undkomma strängen literal för både python och skal
"\"\copy table (col1, col2) FROM file_location CSV HEADER QUOTE '\\\"' NULL ''\""
kommer att skapa en sträng i python som kommer att vara
"\copy table (col1, col2) FROM file_location CSV HEADER QUOTE '\"' NULL ''\"
Vilket är vad vi fick reda på att vi behövde på vårt skal i första hand!
Redigera (förtydligar något från kommentarerna):
subprocess.call
, när du inte använder shell=True
, tar en iterabel av argument.
Så du kunde ha
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
extra edit:- Observera att för att undvika skalinjektion bör du använda metoden som beskrivs här. Se varningsavsnittet i https://docs.python. org/2/library/subprocess.html#frequently-used-arguments