我想运行一个可执行文件,对位于远程文件管理器上的数据集执行某些处理。作为设计的一部分,我希望文件管理器的位置是灵活的,并且在运行时传递给我的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
并在subprocess命令执行时在机器上进行临时驱动器挂载?我想避免管理驱动器安装的创建和清理。当然,我宁愿不必处理(尽管不太可能)机器上当前正在使用所有驱动器号的情况。
答案 0 :(得分:2)
问题不在于Popen,
,而在于cmd.exe
,它不允许工作目录成为UNC路径。它只是没有;试试吧。你可能有更好的运气在你的shell=False
调用上指定Popen()
,假设你正在运行的任何可执行文件都可以处理UNC路径,但当然如果你正在尝试运行的是一个已构建的命令在cmd.exe
你没有选择。