模块subprocess没有属性'STARTF_USESHOWWINDOW

11 投票
4 回答
25592 浏览
提问于 2025-04-16 10:02

大家好,Stack Overflow的用户们,

我遇到了一个让人很烦恼的问题,找不到解决办法。

昨天我在尝试找一种方法来隐藏一个subprocess.Popen的窗口。举个例子,如果我打开命令提示符,我希望它是隐藏的,而且是永久隐藏。

我找到了这段代码:

kwargs = {}
if subprocess.mswindows:
     su = subprocess.STARTUPINFO()
     su.dwFlags |= subprocess.STARTF_USESHOWWINDOW
     su.wShowWindow = subprocess.SW_HIDE
     kwargs['startupinfo'] = su 
subprocess.Popen("cmd.exe", **kwargs)

效果非常好!

但是今天,由于一些我不想详细说明的原因,我不得不重新安装python 3(32位)。

现在,当我运行我的程序时,出现了这个错误:

Traceback (most recent call last):
  File "C:\Python31\hello.py", line 7, in <module>
    su.dwFlags |= subprocess.STARTF_USESHOWWINDOW
AttributeError: 'module' object has no attribute 'STARTF_USESHOWWINDOW'

我使用的是32位的python3.1.3,和之前一样。

如果你们有任何线索或者替代方案,请一定告诉我,谢谢。

注意:我希望找到一种简短的方法来隐藏这个应用,而不是像两页代码那样复杂。

4 个回答

4

可能是重新安装出错了,或者你创建了一个叫做subprocess.py的模块却忘记了。 :)

试试下面这个:

import subprocess
print(subprocess.__file__)

这样可以找到你当前Windows安装的subprocess模块的路径,也就是:

C:\Python31\Lib\subprocess.pyc

如果显示的是

C:\PYthon31\subprocess.py

那就是在导入你自己创建的模块。(你可能要考虑一下,不要把你的Python文件放在Python的安装目录里,像你上面举的例子那样。为每个项目创建一个单独的文件夹会更好,这样可能就不需要那么频繁地安装Python了。 ;))

11

你可以在你的Python环境中重现或检查所描述的问题:

import subprocess
subprocess.STARTF_USESHOWWINDOW

如果问题仍然存在,你应该会看到一个错误信息,最后一行会像这样:

AttributeError: 'module' object has no attribute 'STARTF_USESHOWWINDOW'

解决这个问题的一个可能方法是通过这种方式在你的代码中导入旧的库:

import subprocess
import _subprocess

然后只针对这两个有问题的属性使用它:

# do not show window
info = subprocess.STARTUPINFO()
info.dwFlags = _subprocess.STARTF_USESHOWWINDOW
info.wShowWindow = _subprocess.SW_HIDE

就这样。简单又有效——不需要卸载或安装Python,也不需要回退到旧版本。

1

这是在说Python的两个版本:3.1.3和2.7。简单来说,Python是一种编程语言,而这两个数字代表的是不同的版本。3.1.3是一个更新的版本,而2.7是一个较旧的版本。通常,更新的版本会有更多的新功能和改进,但有时候旧版本也会被一些程序使用,因为它们可能更稳定或者兼容性更好。

import subprocess
import sys

params = dict()
startupinfo = subprocess.STARTUPINFO()
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
params['startupinfo'] = startupinfo

p = subprocess.Popen("cmd.exe", **params)

撰写回答