Использование subprocess.call из python, который содержит экранированные символы - PullRequest
0 голосов
/ 14 сентября 2018

запускаю загрузчик SQL из скрипта Python (2.7);

Пароль содержит знак @.Если я вызываю sql loader из командной строки и экранирую пароль (username/\"p@ssword\"@database), процесс работает.Однако когда я применяю ту же логику в скрипте Python, я получаю сообщение об ошибке:

SQL * Loader-704: Внутренняя ошибка: ulconnect: OCIServerAttach [0]

ORA-12154: TNS: не удалось разрешить указанный идентификатор подключения

Поскольку я могу успешно выполнить ту же команду в приглашении cmd, я не думаю, что это проблема с TNSNAMES.ORAфайл, содержащий неверные или отсутствующие параметры.Я вполне уверен, что это проблема вызова SQL-загрузчика из команды подпроцесса и escape-символов.

Логика Python:

subprocess.call("sqlldr userid=" +config.ddw["user"] + "/\"" + 
config.ddw["password"] +"\"@" + config.ddw["connection"] + " 
control=C:/projects/controlFile.ctl log=C:/logFile.log)

Если я напечатаю этот оператор, строка будет выглядеть так:

sqlldr userid=USERNAME/"p@ssw0rd"@connection/db 
 (2.7)control=C:/projects/controlFile.ctl log=C:/logFile.log

Когда я загружаю строку прямо в командной строке, она работает:

sqlldr userid=USERNAME/\"p@ssw0rd\"@connection/db 
control=C:/projects/controlFile.ctl log=C:/logFile.log

1 Ответ

0 голосов
/ 14 сентября 2018

Вам нужно экранировать двойные кавычки, чтобы sqlldr их увидел.Я не знаю Python, но, похоже, вам нужно изменить этот код, чтобы получить обратную косую черту перед двойными кавычками.Вам также может понадобиться избежать обратной косой черты, поскольку это, скорее всего, специальный символ.

Возможно, что-то вроде этого?

subprocess.call("sqlldr userid=" +config.ddw["user"] + "/\\"" + 
config.ddw["password"] +"\\"@" + config.ddw["connection"] + " 

Это SWAG, поэтому ваш пробег может немного отличаться: -)

...