Cố gắng không sử dụng shell=True
nếu bạn có thể tránh nó. tốt hơn nên tự mã hóa lệnh để giúp sh.
subprocess.call(["psql", "-U", "{user}", "-h", "{ip}", "-d", "{db}", "-w", "{pw}", "-c", "{copy statement}"])
Trong trường hợp này, câu lệnh sao chép của bạn có thể giống như nó được chuyển đến nguyên văn psql, vì không có shell trích dẫn các vấn đề cần tính đến. (N.B. vẫn phải trích dẫn điều này cho python, vì vậy chuỗi sẽ vẫn như cũ).
Nếu bạn vẫn muốn sử dụng shell=True
thì bạn phải thoát khỏi chuỗi theo nghĩa đen cho cả python và vỏ
"\"\copy table (col1, col2) FROM file_location CSV HEADER QUOTE '\\\"' NULL ''\""
sẽ tạo một chuỗi trong python sẽ là
"\copy table (col1, col2) FROM file_location CSV HEADER QUOTE '\"' NULL ''\"
Đó là những gì chúng tôi phát hiện ra rằng chúng tôi cần trên shell của mình ngay từ đầu!
Chỉnh sửa (làm rõ điều gì đó từ các nhận xét) :
subprocess.call
, khi không sử dụng shell=True
, có một đối số có thể lặp lại.
Vì vậy, bạn có thể có
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)
Xem https://docs.python.org/2/library/ subprocess.html # subprocess.call hoặc https://docs.python.org/3/library/ subprocess.html # subprocess.call
chỉnh sửa bổ sung:- Xin lưu ý rằng để tránh tiêm vỏ, bạn nên sử dụng phương pháp được mô tả ở đây. Xem phần cảnh báo của https://docs.python. org / 2 / library / subprocess.html # thường-dùng-đối số