首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WindowsError:[错误6]句柄无效

WindowsError:[错误6]句柄无效
EN

Stack Overflow用户
提问于 2017-03-24 13:11:30
回答 2查看 7.2K关注 0票数 1

我试图在QGIS上开发python插件,并尝试使用子进程执行二进制程序:

代码语言:javascript
复制
program = os.path.join(self.tranusConf.tranusBinPath,'pasos' + self.extension)
    if not os.path.isfile(program):
        logging.error('The <pasos> program was not found in %s'%self.tranusBinPath )
        return 0
    outpasos = os.path.join(self.resultDirectory, "outpasos.txt")
    outpasoserr = os.path.join(self.resultDirectory, "outpasoserr.txt")
    args = [program, self.tranusConf.scenarioId, " "]
    result = subprocess.Popen(args,stdout=open(outpasos, "w"), stderr = open(outpasoserr, 'w'), close_fds = False, cwd = self.tranusConf.workingDirectory) # Success! 
    return 1

我有个问题:

代码语言:javascript
复制
An error has occurred while executing Python code: 
     WindowsError: [Error 6] Descripteur non valide  Traceback (most recent call last): File "C:/Users/emna/.qgis2/python/plugins\OptionsTRANUS\launch_tranus_dialog.py", line 109, in run_tranus
            interface.runTranus(tab.spin_box.value())
          File "C:/Users/emna/.qgis2/python/plugins\OptionsTRANUS\LcalInterface.py", line 426, in runTranus
            self.runPasos()
          File "C:/Users/emna/.qgis2/python/plugins\OptionsTRANUS\LcalInterface.py", line 311, in runPasos
            result = subprocess.Popen(args,stdout=open(outpasos, "w"), stderr = open(outpasoserr, 'w'), close_fds = False, cwd = self.tranusConf.workingDirectory) # Success!
          File "C:\OSGEO4~1\apps\Python27\lib\subprocess.py", line 703, in __init__
            errread, errwrite) = self._get_handles(stdin, stdout, stderr)
          File "C:\OSGEO4~1\apps\Python27\lib\subprocess.py", line 839, in _get_handles
            p2cread = self._make_inheritable(p2cread)
          File "C:\OSGEO4~1\apps\Python27\lib\subprocess.py", line 878, in _make_inheritable
        _subprocess.DUPLICATE_SAME_ACCESS)
    WindowsError: [Error 6] Descripteur non valide

我搜索了其他有相同错误的人,他们建议调用shell = True或使用os.popen,但它不起作用。

有关信息,我正在使用Windows 7 64位。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-24 16:39:12

解决:我添加了shell = True

代码语言:javascript
复制
proc = subprocess.Popen(args,shell=True,stdout=open(outimploc, 'w'), stderr=open(outimplocerr,'w'),stdin = subprocess.PIPE, cwd=self.tranusConf.workingDirectory).communicate()
票数 2
EN

Stack Overflow用户

发布于 2017-03-24 14:33:40

我找到了我的问题的部分解决方案:

代码语言:javascript
复制
devnull = open(os.devnull, 'wb')
result = subprocess.Popen(args,stdout = open(outtrans, "w"), stderr = open(outtranserr,'w'),stdin=devnull, cwd = self.tranusConf.workingDirectory).communicate()

它起作用了。但是,在我的插件中,执行的程序的windows cmd的多次打开使我感到尴尬。这对我的插件来说并不是非常漂亮的。

编辑:与使用stdin=subprocess.PIPE相同

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43000394

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档