Python 中 os.startfile 和 subprocess.Popen 运行 exe 程序有问题

发表于 : 07-01   · CC BY-NC-SA 4.0 ·   144 人浏览

➭ Windows 11
➭ Python 3.8

很久以前就其实也碰到过这个问题, 逃避了.
如今现在 又碰到了, 必须 要用 Py 运行程序启动 exe
最后的灵感是, 在逛精易论坛,发现个帖子 : < 运行()和 手动双击exe 有区别 >

程序运行时 需要 command_line 相关参数, 哪怕是空的, 还有程序调用底层API控制窗口和窗口外观的问题.

# 创建进程_EX
import win32process
import win32con
import win32api
import os

def create_process_ex(program_path, command_line="", show_command=win32con.SW_SHOWNORMAL, current_directory=""):
    if not current_directory:
        current_directory = os.path.dirname(program_path)
    startupinfo = win32process.STARTUPINFO()
    startupinfo.dwFlags = win32con.STARTF_USESHOWWINDOW  # 指定使用 wShowWindow
    startupinfo.wShowWindow = show_command
    process_handle = None
    thread_handle = None
    process_id = 0
    try:
        process_info = win32process.CreateProcess(
            program_path,
            command_line,
            None,  # 进程的安全属性
            None,  # 线程的安全属性
            False, # 是否继承句柄
            0,     # 创建标志 (这里为0表示使用默认)
            None,  # 新进程的环境块
            current_directory,
            startupinfo
        )
        process_handle = process_info[0]
        thread_handle = process_info[1]
        process_id = process_info[2]
        if process_handle:
            win32api.CloseHandle(process_handle)
        if thread_handle:
            win32api.CloseHandle(thread_handle)
        return process_id

    except Exception as e:
        if process_handle:
            win32api.CloseHandle(process_handle)
        if thread_handle:
            win32api.CloseHandle(thread_handle)
        return 0

if __name__ == '__main__':
    url = r"C:\Hawk\Start.exe"
    process_id= create_process_ex(url) 
    if process_id:
        print(f"进程创建成功. PID: {process_id}")
    else:
        print("创建进程失败.")
Python python3 Win11 Windows API 底层API subprocess startfile win32process