Probeer shell=True
niet te gebruiken als je het kunt vermijden. het is beter om het commando zelf te tokeniseren om sh te helpen.
subprocess.call(["psql", "-U", "{user}", "-h", "{ip}", "-d", "{db}", "-w", "{pw}", "-c", "{copy statement}"])
In dit geval zou uw kopieeropdracht kunnen zijn zoals het woordelijk aan psql wordt doorgegeven, omdat er geen shell is citaten om rekening mee te houden. (N.B. moet dit nog steeds citeren voor python, dus de string blijft zoals hij is).
Als je nog steeds shell=True
. wilt gebruiken dan moet je ontsnappen aan de letterlijke tekenreeks voor zowel python en schelp
"\"\copy table (col1, col2) FROM file_location CSV HEADER QUOTE '\\\"' NULL ''\""
maakt een string in python die
. zal zijn"\copy table (col1, col2) FROM file_location CSV HEADER QUOTE '\"' NULL ''\"
Dat is wat we ontdekten dat we in de eerste plaats op onze schaal nodig hadden!
Bewerken (iets verduidelijkt uit de opmerkingen):
subprocess.call
, als u shell=True
niet gebruikt , neemt een iteratie van argumenten.
Dus je zou kunnen hebben
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)
Zie https://docs.python.org/2/library/ subprocess.html#subprocess.call of https://docs.python.org/3/library/ subprocess.html#subprocess.call
extra bewerking:- Houd er rekening mee dat om shell-injectie te voorkomen, u de hier beschreven methode moet gebruiken. Zie de waarschuwingssectie van https://docs.python. org/2/library/subprocess.html#frequently-used-arguments