os.listdir и т. д. завершается с ошибкой на пути к общим окнам (Python 2.5) - PullRequest
0 голосов
/ 12 января 2010

Я вижу странное поведение при разборе общих путей (общие пути на сервере, например, \ storage \ Builds)

Я читаю текстовый файл, который содержит пути к каталогам, которые я хочу обработать в дальнейшем. Для этого я делаю так:

def toWin(path):
    return path.replace("\\", "\\\\")

for line in open(fileName):
    l = toWin(line).strip()
    if os.path.isdir(l):
        print l # os.listdir(l) etc..

Это работает для локальных каталогов, но не для путей, указанных в общей системе.

e.g. 
    E:\Test -- works
    \\StorageMachine\Test -- fails [internally converts to \\\\StorageMachine\\Test]
    \\StorageMachine\Test\ -- fails  [internally converts to \\\\StorageMachine\\Test\\]

Но если я открою оболочку python, импортирую скрипт и вызову функцию с той же строкой пути, то это будет работать!

Кажется, что парсинг общих путей окон ведет себя по-разному в обоих случаях.

Есть идеи / предложения?

Ответы [ 3 ]

0 голосов
/ 12 января 2010

Необходимо преобразовать ввод в косую черту (в стиле Unix) для модулей OS. * Для правильного анализа.

измененный код, как показано ниже

def toUnix(path):
    return path.replace("\\", "/")

Теперь все модули анализируются правильно.

0 голосов
/ 22 января 2010

Просто нет причин "конвертировать". Обратные слеши интерпретируются только тогда, когда они содержатся в строковых литералах в вашем коде, а не когда вы программно читаете их из файла. Поэтому вам следует отключить функцию преобразования, и, вероятно, все будет работать.

0 голосов
/ 12 января 2010

Это может быть не вашей реальной проблемой, но ваши UNC-пути на самом деле не верны - они должны начинаться с двойной обратной косой черты, но внутренне использовать только одну обратную косую черту в качестве разделителя.

Я не уверен, почему то же самое будет работать в оболочке.

Обновление: Я подозреваю, что происходит то, что в оболочке ваша строка интерпретируется оболочкой (с заменами), в то время как в вашем коде она обрабатывается, как видно впервые - в основном, указание строки в оболочке отличается от чтения это со входа. Чтобы получить тот же эффект от оболочки, вам нужно указать его как необработанную строку с r"string"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...