Ian*_* C. 4 python windows subprocess unc
我想运行一个可执行文件,对位于远程文件管理器上的数据集执行一些处理。作为设计的一部分,我希望文件管理器的位置灵活,并且在运行时传递给我的 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')
Run Code Online (Sandbox Code Playgroud)
只要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.
Run Code Online (Sandbox Code Playgroud)
有没有办法使这个子进程调用工作,而无需iwd在子进程命令执行时在存在的机器上解析和进行临时驱动器安装?我想避免管理驱动器安装的创建和清理。当然,我宁愿不必处理(尽管不太可能)所有驱动器号当前都在机器上使用的情况。
问题不在于Popen,,而在于cmd.exe,它不允许工作目录成为 UNC 路径。它只是没有;尝试一下。您可能有更好的运气指定shell=False您的Popen()通话,假设任何可执行文件正在运行,如果你想运行的是一种建立在一个命令可以处理UNC路径,当然cmd.exe你没有选择。
| 归档时间: |
|
| 查看次数: |
5451 次 |
| 最近记录: |