我希望运行一个可执行文件,对位于远程filer上的数据集进行处理。作为设计的一部分,我希望filer的位置是灵活的,并且在运行时将其传递给我的Python程序。
我已经编写了以下代码段,以说明我的问题,但使用python命令,因此任何人都可以运行它:
只要
有没有一种方法可以使这个子进程调用工作,而不需要解析iwd并在子进程命令执行时在机器上创建一个临时驱动器挂载?我想避免管理驱动器挂载的创建和清理。当然,我也不想处理(虽然不太可能出现)所有驱动器字母当前都在使用的情况。
我已经编写了以下代码段,以说明我的问题,但使用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并在子进程命令执行时在机器上创建一个临时驱动器挂载?我想避免管理驱动器挂载的创建和清理。当然,我也不想处理(虽然不太可能出现)所有驱动器字母当前都在使用的情况。
cmd.exe
上 -- 我会尝试使用 shell=False。我要运行的内容不是内置于cmd.exe
中的,这真是太好了。 - Ian C.python -h
作为命令,而不是dir
。将shell=True
更改为shell=False
已经为我解决了问题。谢谢。 - Ian C.