【问题标题】:Subprocess.Popen() : hide the cmd shellSubprocess.Popen() : 隐藏 cmd shell
【发布时间】:2012-12-29 10:59:07
【问题描述】:

我试图在启动时调用一个可执行文件,这将调用另一个可执行文件本身。对于第一部分,我只是将可执行文件的路径添加到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)

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

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

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

这是我尝试实现的顺序:

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

【问题讨论】:

标签: python windows cmd subprocess


【解决方案1】:

这是 Python 程序员遇到的典型问题 - 因此,Python 本身提供了解决方案。已经被问过很多次了,例如here,但对你来说,问题有点复杂。

这完全取决于您是使用python.exe 还是pythonw.exe 来运行您的脚本。第一个打开了控制台,第二个没有。

当您使用已编译的脚本时,您必须告诉“编译器”您要使用哪个版本。假设您使用的是 py2exe,您可以查看this post on SO。这里详细解释了如何进行。

【讨论】:

  • 这仅对涉及 python 进程的控制台窗口有效(显示调试信息等...)它与使用 Popen 打开与控制台相关的子进程无关。已经测试过很多次了。您唯一能做的就是使用 SHELL=True 标志,缺点是您无法控制来自子进程的异常/错误。你根本不会得到任何信息。例如,如果由于系统无法在磁盘上找到 exe 而导致子进程未加载,系统将不会告诉您。不是很方便。
【解决方案2】:

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

【讨论】:

  • @NNzz HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run 运行您的第一个可执行文件有什么价值?请准确描述您拥有的可执行文件类型;它们是 Python 脚本还是已编译的 Python 脚本或某种组合?
  • 它们是我编译成可执行文件的 Python 脚本。键的值为D:\myscript.exe,这是我要运行的可执行文件的实际位置。为了更准确,我会在帖子中添加一些信息。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    你可以编译成exe格式。当我遇到这个问题时, 我使用 py2exe 将 python 文件编译为不可见的可执行文件。

    您所要做的就是更改 setup.py 文件(用于编译),从

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

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

    【讨论】:

      【解决方案5】:

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

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

      通过以下方式安装:

      pip install pyinstaller(更多信息here

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

      pyinstaller yourfilename.py -F --windowed
      

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

      【讨论】:

        猜你喜欢
        • 2014-09-27
        • 1970-01-01
        • 2021-05-31
        • 2017-05-19
        • 1970-01-01
        • 2012-12-25
        • 2016-11-09
        • 2013-01-12
        • 1970-01-01
        相关资源
        最近更新 更多