在工作目录为UNC路径而不是映射驱动器时调用subprocess.Popen()函数

6
我希望运行一个可执行文件,对位于远程filer上的数据集进行处理。作为设计的一部分,我希望filer的位置是灵活的,并且在运行时将其传递给我的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个回答

6
问题并不在于 Popen,而是在于 cmd.exe,因为它不允许工作目录是 UNC 路径。不管怎样都不行;你可以尝试在 Popen() 调用中指定 shell=False,假设你运行的可执行文件能够处理 UNC 路径,但如果你要运行的命令是内置在 cmd.exe 中的,则没有选择余地。

1
肯定问题出在 cmd.exe 上 -- 我会尝试使用 shell=False。我要运行的内容不是内置于 cmd.exe 中的,这真是太好了。 - Ian C.
2
我更新了问题,使用python -h作为命令,而不是dir。将shell=True更改为shell=False已经为我解决了问题。谢谢。 - Ian C.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接