在不显示 Windows 控制台的情况下运行 Python 脚本

有没有什么方法可以在 WindowsXP 中运行 Python 脚本,而不会立即出现命令 shell?我经常需要使用 Python 自动化 WordPerfect (用于工作) ,即使我的脚本没有输出,如果我在没有 WP 的情况下执行它,一个空的 shell 仍然会在消失之前弹出一秒钟。有什么办法能阻止这一切吗?也许是某种输出重定向?

115609 次浏览

Exe 将在没有命令提示符的情况下运行脚本。问题是 Python 解释器 Python.exe 被链接到控制台子系统以产生控制台输出(因为90% 的情况都是这样)—— pythonw.exe 被链接到 GUI 子系统,Windows 不会为它创建一个控制台输出窗口,除非它要求一个窗口。

本文 讨论了使用 Python 进行 GUI 编程,还提到了 pythonw.exe。它还有助于指出,如果 Python 文件以 .pyw而不是 .py结尾,标准 Windows Installer 将正确建立关联,并在 pythonw.exe 中运行 Python。

在您的情况下,这听起来不像是一个问题,但是对 pythonw.exe 的依赖使您的应用程序成为特定于 Windows 的——例如,在 Mac OS X 上存在其他解决方案来实现这一点。

如果您将您的文件命名为。然后 windows 将使用 pythonw.exe 解释器执行它们。这将不会打开用于运行脚本的 dos 控制台。

我尝试了上面的方法,但是,控制台仍然出现和消失很快,由于计时器在我的脚本。最后,我发现了以下代码:

import ctypes
import os
import win32process


hwnd = ctypes.windll.kernel32.GetConsoleWindow()
if hwnd != 0:
ctypes.windll.user32.ShowWindow(hwnd, 0)
ctypes.windll.kernel32.CloseHandle(hwnd)
_, pid = win32process.GetWindowThreadProcessId(hwnd)
os.system('taskkill /PID ' + str(pid) + ' /f')

我也有同样的问题,我尝试了很多选择,但都失败了 但是我尝试了这个方法,它神奇地起作用了!

因此,我把这个 python 文件(mod.py)放在一个文件夹中,我过去常常使用命令提示符运行它 当我用来关闭 cmd 的 GUI 是自动关闭... (SAD) , 所以我运行它如下 C:\....>pythonw mod.py 别忘了 pythonw“ w”是 IMP

在 Win10中很容易:
打开 PowerShell 并键入以下命令:

type nul > openWindowed.vbs
type nul > main.py
notepad openWindowed.vbs

粘贴下一个到你的 OpenWindowed.vbs文件:

Set WshShell = CreateObject("WScript.Shell")
WshShell.Run chr(34) & "C:\Users\path\to\main.py" & Chr(34), 0
Set WshShell = Nothing

。 vbs文件将在不打开 cmd 的情况下执行 Main Py文件。我经常在 化妆文件中使用这个命令,因为我不知道 cmake 脚本。

将文件扩展名更改为。然后在脚本的开头添加以下代码行(根据您的 python 版本进行了相应的更改) :

#! c:\\Users\\sohra\\AppData\\Local\\Programs\\Python\\Python38\\pythonw.exe

现在,如果您双击该文件,那么 pythonw.exe 将在没有控制台窗口的情况下执行该文件。

关闭窗口防御程序,并使用 pip install pyinstaller安装 pyinstaller软件包。

在安装打开的 cmd 并键入 pyinstaller --onefile --noconsole filename.py之后

这将适用于所有 Windows 版本:

使用记事本(或任何其他文本编辑器)创建“ 跑者,蝙蝠”文件,并插入以下内容:

@echo off
python server.py

其中 Server.py是要运行的 Python 脚本的路径。

2. 使用记事本创建“ RunScript.vbs”文件,并插入以下内容:

CreateObject("Wscript.Shell").Run "runner.bat",0,True

双击运行“ RunScript.vbs”文件,Python 脚本将在没有任何可见控制台窗口的情况下运行

我知道这不是你问题的一部分,但通常情况是这样的,如果你想在 windows start 上运行脚本(在用户登录后) ,只需将“ RunScript.vbs”文件的快捷方式粘贴到你的启动文件夹中。(在 Windows10上大部分在: C: 用户[用户名] AppData 漫游 MicrosoftWindows 开始菜单程序启动下)

最好的问候

我认为,Windows 中有 两个选择:

    1. .py文件扩展名更改为。在第一行用 pythonw.exe替换 pyw(注意替换 <your_username>\\<your_path_to>) :

      #! C:\\Users\\<your_username>\\<your_path_to>\\Scripts\\pythonw.exe
      
    2. 双击 .pyw脚本文件运行它。

    3. 也可以创建一个从 捷径.pyw的文件,将它的 姓名偶像快捷键自定义为 最后的发射器

    1. 保留 .py文件扩展名,并在第一行用 python.exe替换 pythonw.exe,如下所示(注意替换 <your_username>\\<your_path_to>) :

      #! C:\\Users\\<your_username>\\<your_path_to>\\Scripts\\python.exe
      
    2. 使用包含以下内容的 .vbs(Visual Basic Script)文件作为 .py文件的启动程序(您可以使用 .vbs文件也启动 .bat文件而不显示提示符) :

      Set WshShell = CreateObject("WScript.Shell")
      WshShell.Run "C:\Users\<your_username>\<your_path_to>\Scripts\python.exe C:\Users\<your_username>\<your_path_to>\script.py", 0, True
      Set WshShell = Nothing
      
    3. 双击 .vbs文件运行 .py脚本。

    4. 也可以创建一个从 捷径.vbs的文件,将它的 姓名偶像快捷键自定义为 最后的发射器

当您安装 安装工时,您将能够将。变成了一个。前任。在设置中,可以更改是否显示 Python 在运行文件时打开的控制台窗口。

是啊,这是另一个问题,他妈的蟒蛇。stanza通过 Python exe工作得很好,而它在 Python.exe上失败了。甚至,没有可行的机制来输出 sysout 或 syserr。因此,我编写了一个 C # 程序来在没有命令窗口的情况下启动 python。

public class Program
{
private string python = @"D:\Libs\Python38\Python38_64\python.exe";
private string args = "mdx_server.py";
private string wkDir = "D:\\Program Files\\mdx-server";
    

public static void Main(string[] args) {
Program app = new Program();
Console.WriteLine(app.python + " " + app.args + " " + app.wkDir);
app.Exec();
Console.WriteLine("Start done!");
}


private void runThread() {
Process process = new Process();
try {
process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
process.StartInfo.Arguments = args;


process.StartInfo.CreateNoWindow = true;
process.StartInfo.FileName = python;
process.StartInfo.WorkingDirectory = wkDir;


process.StartInfo.UseShellExecute = false;
process.Start();
} catch (Exception ex) {
Console.WriteLine(ex.Message);
}
}


public void Exec() {
Thread _worker = new Thread(runThread);
_worker.Start();
}
}