Непредсказуемые результаты os.path.join в Windows - PullRequest
1 голос
/ 13 февраля 2011

Итак, что я пытаюсь сделать, это присоединиться к чему-либо в форме

os.path.join('C:\path\to\folder', 'filename'). 

** редактировать: Фактический код:

filename = 'creepy_%s.pcl' % identifier
file = open(os.path.join(self.cache_dir, filename), 'w')

где self.cache_dir читается из файла с помощью configobj (возвращает строку) и в конкретном случае это «\ Documents and Settings \ Administrator \ creepy \ cache»

Первая часть возвращается из файла конфигурации, используя configobj. Второй - это объединение двух строк, например: 'file% s'% name

Когда я запускаю приложение через консоль в Windows, используя установленный интерпретатор python, я получаю ожидаемый результат, который равен

C:\\path\\to\\folder\\filename 

Когда я связываю одно и то же приложение и интерпретатор python (ту же версию, 2.6) в исполняемом файле в Windows и запускаю приложение, вместо этого получается

C:\\path\\to\\folderfilename

Есть какие-нибудь подсказки относительно того, в чем может быть проблема, или что может вызвать такие несоответствия в выходных данных?

Ответы [ 4 ]

0 голосов
/ 15 февраля 2011

Я понял это вчера. Как обычно, когда вещи кажутся действительно странными, объяснение очень простое и в большинстве случаев подразумевает, что вы глупы.

Короче говоря, в дистрибутивах были остатки некоторых предыдущих установок. Связанный интерпретатор загрузил модуль оттуда, но когда я запустил скрипт python из терминала, модуль (более новая версия) в текущем каталоге был загружен. Отсюда и «непредсказуемые» результаты.

0 голосов
/ 13 февраля 2011

Это удивительное поведение. Нет причины, по которой он должен вести себя так.

Только будьте осторожны, вы можете изменить строку на следующую.

os.path.join(r'C:\path\to\folder\', 'filename'). 

Обратите внимание на r'' необработанную строку и окончательную \

0 голосов
/ 13 февраля 2011

Три вещи, которые вы можете сделать:

  1. Используйте двойную косую черту в исходной строке, 'C: \\ path \\ to \\ folder'

  2. Использовать необработанную строку, r'C: \ path \ to \ folder '

  3. Использовать косую черту, 'C: / path / to / folder'

0 голосов
/ 13 февраля 2011

Ваш код поврежден. Вам нужно удвоить эти обратные слеши или использовать необработанную строку.

os.path.join('C:\\path\\to\\folder', 'filename'). 

Я не знаю, почему это работает в одном интерпретаторе, а не в другом, но ваш код не будет правильно интерпретироваться как есть. Странно то, что я ожидал другого выхода, например: C:pathtofolder\filename.

...