shell=True
. का उपयोग न करने का प्रयास करें अगर आप इससे बच सकते हैं। श की मदद करने के लिए अपने आप को कमांड को टोकनाइज़ करना बेहतर है।
subprocess.call(["psql", "-U", "{user}", "-h", "{ip}", "-d", "{db}", "-w", "{pw}", "-c", "{copy statement}"])
इस मामले में तब आपका कॉपी स्टेटमेंट ऐसा हो सकता है जैसे इसे psql शब्दशः पास किया जाता है, क्योंकि कोई शेल नहीं है। ध्यान में रखने के लिए मुद्दों का हवाला देते हुए। (N.B. को अभी भी इसे अजगर के लिए उद्धृत करना है, इसलिए स्ट्रिंग यथावत रहेगी)।
यदि आप अभी भी shell=True
. का उपयोग करना चाहते हैं तो आपको दोनों अजगर और . के लिए स्ट्रिंग अक्षर से बचना होगा खोल
"\"\copy table (col1, col2) FROM file_location CSV HEADER QUOTE '\\\"' NULL ''\""
अजगर में एक स्ट्रिंग बनाएगा जो होगा
"\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/3/library/ subprocess.html#subprocess.call
अतिरिक्त संपादन :- कृपया ध्यान दें कि शेल इंजेक्शन से बचने के लिए आपको यहां वर्णित विधि का उपयोग करना चाहिए। https://docs.python का चेतावनी अनुभाग देखें। org/2/library/subprocess.html#अक्सर-यूज्ड-आर्ग्यूमेंट्स