Как передать путь к файлу из Python в командную строку Windows, не избегая проблем?

#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()