shell=True
を使用しないようにしてください あなたがそれを避けることができれば。自分でコマンドをトークン化して、shを支援することをお勧めします。
subprocess.call(["psql", "-U", "{user}", "-h", "{ip}", "-d", "{db}", "-w", "{pw}", "-c", "{copy statement}"])
この場合、 shell がないため、copyステートメントはpsqlにそのまま渡される可能性があります。 考慮すべき問題を引用する。 (N.B.はPythonの場合でもこれを引用する必要があるため、文字列はそのままになります)。
それでもshell=True
を使用したい場合 次に、Pythonとの両方の文字列リテラルをエスケープする必要があります シェル
"\"\copy table (col1, col2) FROM file_location CSV HEADER QUOTE '\\\"' NULL ''\""
Pythonで文字列を作成します
"\copy table (col1, col2) FROM file_location CSV HEADER QUOTE '\"' NULL ''\"
そもそもシェルに必要なのはこれです!
編集 (コメントから何かを明らかにする):
subprocess.call
、shell=True
を使用しない場合 、反復可能な引数を取ります。
だからあなたは持っていることができます
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)
https://docs.python.org/2/library/を参照してくださいsubprocess.html#subprocess.call
または
追加の編集:-シェルインジェクションを回避するために、ここで説明する方法を使用する必要があることに注意してください。 https://docs.pythonの警告セクションを参照してください。 org / 2 / library / subprocess.html#frequently-used-arguments