#python
Вопрос:
Я пытаюсь настроить вызов подпроцесса в bcp, но сталкиваюсь с проблемой с путями к файлам Windows, использующими обратные косые черты.
В python обратная косая черта экранируется другой обратной косой чертой, и это прекрасно работает в большинстве случаев.
Однако, поскольку в командной строке ожидается , что в пути к файлу будет использоваться один, и python передает его\, команда завершится ошибкой.
Поскольку я объединяю команду из нескольких аргументов (мне нужен путь к исходному файлу, файлу форматирования и файлу журнала), кажется невозможным выполнить эти соединения без вставки Python дополнительного escape-символа.
Даже ос.соединение сохранит строку, которую оно создает, с помощью экранирующих символов.
Можно ли заставить Windows игнорировать лишние обратные косые черты или удалить их программно?
Вот код, о котором идет речь:
datacommand = ('bcp.exe ' table_path ' in ' file_path
" -f " format_path " -e " log_path " -S "
self.server instance
" -T -q -t" sep " -F" str(int(header) 1))
subprocess.call(datacommand)
Вызов построен в функции-члене оболочки PYODBC, которая у меня есть, хотя это больше для логической организации, чем зависит от методов или переменных класса.
Различные пути не жестко закодированы, но генерируются далее по функции.
Если я напечатаю строку в оболочке и скопирую ее в командную строку, она будет работать идеально, так как при печати удаляются лишние escape-символы.
Комментарии:
1. Как вы генерируете свою командную строку? Python не будет удваивать обратные косые черты, если вы не печатаете
__repr__
значение.2. вы можете попробовать использовать букву r перед путем к строке.
3. Возможно ли принудительно интерпретировать строку как необработанную после ее создания?
4. Windows затрудняет комплексное решение этого класса проблем, поскольку позволяет каждой программе реализовывать свой собственный анализатор командной строки; поэтому то, что программа A анализирует escape-символы определенным образом, не означает, что программа B будет делать то же самое. В комплекте с libc есть стандартный/стандартный синтаксический анализатор, но не каждая программа использует его.
5. Тем не менее, двойные обратные косые черты в Python на самом деле не являются проблемой, потому что они являются частью того, как Python печатает строку, когда строит ее представление; на самом деле они не являются частью содержимого строки.
Ответ №1:
Спасибо @Charles Duffy за подробную разбивку.
Как оказалось, проблема заключалась в использовании подпроцесса.вызов из скрипта python вызывает зависание, так как он ожидает, что команда что-то вернет, а в случае BCP возврата нет.
Решение состоит в том, чтобы использовать:
process = subprocess.Popen(command)
process.terminate()