Subprocess.Popen():隐藏cmd shell

时间:2013-01-15 10:52:13

标签: python windows cmd subprocess

我试图在启动时调用可执行文件,它将调用另一个可执行文件本身。对于第一部分,我只是将可执行文件的路径添加到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run,这有效,我的可执行文件在启动时被调用。

后者包含以下这些内容:

startupinfo = subprocess.STARTUPINFO()
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
startupinfo.wShowWindow = subprocess.SW_HIDE
proc = subprocess.Popen(command, startupinfo=startupinfo)

但是,计算机启动时会弹出命令shell(cmd)。一切正常,但它是可见的而不是隐藏的...所以基本上,我如何隐藏这个命令shell?

使用ProcessExplorer时,我有以下层次结构:

+ System
|_ Interrupts
|_ smss.exe
    |_ some processes...
+ explorer.exe
    |_ some processes...
|_ MYSCRIPT.EXE

以下是我尝试实现的顺序:

  • 我创建了一个ISO文件,其中包含我想在VM上运行的所有Python可执行文件。其中一个(master.exe)调用其他人。
  • 我创建了一个自动挂载后者的VM
  • 已准备好的VM有一个调用D:\master.exe
  • 的计划任务
  • master.exe(除了我们关注的其他任务之外)将值D:\myscript.exe添加到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
  • VM重新启动
  • 运行
  • D:\myscript.exe(并且它正常工作),但它确实在命令提示符下运行,我希望它不可见。

5 个答案:

答案 0 :(得分:3)

这是Python程序员遇到的典型问题 - 因此,Python本身提供了一个解决方案。它已被多次询问,例如here,但对你而言,这个问题有点复杂。

是否使用python.exepythonw.exe来运行脚本。对于第一个,打开控制台,第二个不打开。

当你使用编译过的脚本时,你必须告诉"编译器"您要使用哪个版本。假设您正在使用py2exe,您可以查看this post on SO。这里详细解释了如何继续。

答案 1 :(得分:1)

正在打开的控制台窗口可能属于运行脚本的Python进程。向我们显示运行脚本的注册表中的条目。

答案 2 :(得分:0)

如果运行控制台程序,Windows将创建一个控制台窗口。 “python.exe”是一个控制台程序。

如果您不想要控制台窗口,可以使用“pythonw.exe”而不是“python.exe”运行Python脚本。

答案 3 :(得分:0)

您可以将其编译为exe格式。当我遇到这个问题时, 我使用 py2exe 将python文件编译为隐藏的可执行文件。

您需要做的就是从

更改setup.py文件(用于编译)
setup(console=['__main__.py'], options={"py2exe":{"includes":["sip"]}})

setup(windows=['__main__.py'], options={"py2exe":{"includes":["sip"]}})

答案 4 :(得分:0)

我遇到了同样的问题而我使用了Pyinstaller

Pyinstaller是一个智能的跨平台工具,可将.py文件编译为独立的可执行文件。

通过以下方式安装:

pip install pyinstaller(更多信息here

使用以下命令隐藏控制台(使脚本成为进程):

pyinstaller yourfilename.py -F --windowed

(使用“-F”标志,您将获得单个.exe文件,并使用“--windowed”标志控制台将被隐藏)

相关问题