如何获取子流程默认值/预设值/行为

2024-10-04 07:31:01 发布

您现在位置:Python中文网/ 问答频道 /正文

在这篇post中,我解释了如何检查windows会话中打开了多少QGIS项目

以下是缩写代码:

import os
import subprocess
from os.path import basename
from PyQt4.QtGui import QMessageBox

def checkQgisProcesses(self):
    try:
        from subprocess import DEVNULL
    except ImportError:
        DEVNULL = os.open(os.devnull, os.O_RDWR)

    res = subprocess.check_output('C:\Windows\System32\cmd.exe /c tasklist /FI "IMAGENAME eq qgis-bin.exe" -v 2>NUL', stdin=DEVNULL, stderr=DEVNULL, startupinfo = info)
    ...

def someOtherFunc(self):
    self.checkQgisProcesses()
    ...

代码使用Windows中的tasklist来获取有关所有打开窗口的信息,并过滤QGIS窗口标题

我在QGIS插件的函数中使用了这段代码

插件中还有另一个函数,我在另一时间调用多个subprocess,用另一个程序(SAGA GIS)进行一些计算:

curv_PATH = plugin_pth + 'dem_curvature.bat'
subprocess.call(["C:\Windows\System32\cmd.exe", "/c", script_PATH], startupinfo = info)
subprocess.call(['gdalwarp', raster_dest_data + 'dem_gaussian.sdat', '-tr', cellsize, cellsize, '-r', 'bilinear', raster_dest_data + 'dem_res.tif' ], startupinfo = info)
subprocess.call(["C:\Windows\System32\cmd.exe", "/c", curv_PATH], startupinfo = info)

问题是这些subprocess调用不再有效。我在QGIS python控制台中没有得到具体的错误

当我评论self.checkQgisProcesses()时,它又起作用了

我认为问题在于DEVNULLstdinstderr参数

如何将它们设置回默认值

更新

我错误地认为问题可能是DEVNULL声明。显然问题在于subprocess.STARTUPINFO()的使用

下面是一个可复制的示例:

import os
from os.path import basename
import subprocess

SW_HIDE = 0
info = subprocess.STARTUPINFO()
info.dwFlags = subprocess.STARTF_USESHOWWINDOW
info.wShowWindow = SW_HIDE

def checkFirefoxProcesses():
    try:
        from subprocess import DEVNULL
    except ImportError:
        DEVNULL = os.open(os.devnull, os.O_RDWR)
    res = subprocess.check_output('C:\Windows\System32\cmd.exe /c tasklist /FI "IMAGENAME eq firefox.exe" -v 2>NUL', stdin=DEVNULL, stderr=DEVNULL, startupinfo = info)
    print res

def helloWorldToText():
    subprocess.call(["C:\Windows\System32\cmd.exe", "/c", r"d:\\hello_world.bat"], startupinfo = info)

checkFirefoxProcesses()
helloWorldToText()

这是来自hello_world.bat的代码:

REM @ECHO OFF

ECHO Hello World! > d:\\hello_world.txt

PAUSE

函数checkFirefoxProcesses()查找打开的firefox进程。要运行该示例,必须打开firefox会话。函数helloWorldToText()在BAT文件的帮助下从ECHO创建一个文本文件

该示例不创建声明为startupinfo = info的文本文件。当我运行函数helloWorldToText()subprocess而不运行startupinfo = info时,它就工作了

这种情况:运行checkFirefoxProcesses()而不运行startupinfo = info,运行helloWorldToText()而运行startupinfo = info是可行的


Tags: 函数代码fromimportinfocmdoswindows