Вызовите subprocess.Popen (), когда рабочий каталог находится на пути UNC, а не на подключенном диске. - PullRequest
2 голосов
/ 04 марта 2011

Я хотел бы запустить исполняемый файл, который выполняет некоторую обработку набора данных, расположенного на удаленном файлере.Как часть дизайна, я бы хотел, чтобы расположение файла было гибким, и что-то, что передавалось моей программе на python во время выполнения.

Я собрал следующий фрагмент кода, который иллюстрирует мою проблему:но с помощью команды python, так что любой может запустить это:

#!/usr/bin/env python
import os
import subprocess

def runMySubProcess(cmdstr, iwd):
    p = subprocess.Popen(cmdstr,
        shell=True,
        cwd=iwd,
        stdout=subprocess.PIPE,
        stderr=subprocess.PIPE)
    (stdout, stderr) = p.communicate()
    if stderr:
        raise IOError, stderr
    return stdout

if __name__ == '__main__':
    print runMySubProcess('python -h', 'C:\\')
    print runMySubProcess('python -h', '\\\\htpc\\nas')

Это прекрасно работает, если iwd находится на общем ресурсе, который сопоставлен с буквой диска на машине.Но если iwd - это UNC-путь, то вызов subprocess.Popen() заканчивается выводом stderr, что, в свою очередь, вызывает исключение IOError:

Traceback (most recent call last):
  File "test.py", line 19, in <module>
    print runMySubProcess('dir', '\\\\htpc\\nas')
  File "test.py", line 14, in runMySubProcess
    raise IOError, stderr
IOError: '\\htpc\nas'
CMD.EXE was started with the above path as the current directory.
UNC paths are not supported.  Defaulting to Windows directory.

Есть ли способ заставить этот вызов подпроцесса работать без обращения к синтаксическому анализу iwd и создания временного монтирования диска на машине, которая существует во время выполнения команды подпроцесса?Я хочу избежать необходимости управлять созданием и очисткой креплений дисков.И, конечно же, я бы предпочел не иметь дело с (хотя и маловероятным) случаем, когда все буквы дисков в данный момент используются на компьютере.

1 Ответ

2 голосов
/ 04 марта 2011

Проблема не в Popen,, а в cmd.exe, что не позволяет рабочему каталогу иметь UNC-путь.Просто нет;попытайся.Возможно, вам повезет больше, указав shell=False в своем вызове Popen(), предполагая, что любой исполняемый файл, который вы запускаете, может обрабатывать UNC-путь, но, конечно, если вы пытаетесь выполнить команду, встроенную в cmd.exe у вас нет выбора.

...