Cobalah untuk tidak menggunakan shell=True
jika Anda bisa menghindarinya. lebih baik untuk menandai perintah itu sendiri untuk membantu sh.
subprocess.call(["psql", "-U", "{user}", "-h", "{ip}", "-d", "{db}", "-w", "{pw}", "-c", "{copy statement}"])
Dalam hal ini maka pernyataan salinan Anda bisa seperti yang diteruskan ke psql kata demi kata, karena tidak ada shell mengutip masalah untuk dipertimbangkan. (N.B. masih harus mengutip ini untuk python, jadi string akan tetap apa adanya).
Jika Anda masih ingin menggunakan shell=True
maka Anda harus keluar dari string literal untuk python dan cangkang
"\"\copy table (col1, col2) FROM file_location CSV HEADER QUOTE '\\\"' NULL ''\""
akan membuat string dalam python yang akan menjadi
"\copy table (col1, col2) FROM file_location CSV HEADER QUOTE '\"' NULL ''\"
Itulah yang kami temukan di cangkang kami sejak awal!
Sunting (mengklarifikasi sesuatu dari komentar):
subprocess.call
, saat tidak menggunakan shell=True
, mengambil argumen yang dapat diubah.
Jadi Anda bisa memiliki
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)
Lihat https://docs.python.org/2/library/ subprocess.html#subprocess.call atau https://docs.python.org/3/library/ subprocess.html#subprocess.call
edit tambahan :- Harap dicatat bahwa untuk menghindari injeksi shell, Anda harus menggunakan metode yang dijelaskan di sini. Lihat bagian peringatan https://docs.python. org/2/library/subprocess.html# frequently-used-arguments