如何在cmd窗口后台执行程序

如何在Windows的cmd下让程序在后台执行?

Hu Dennis, 2008-12-24

在windows下启动JBoss服务器,需要在命令行中输入run.bat。但是运行后如果你想停止服务器,可能的做法就是直接按Ctrl+C键强行终止服务器,显然这种方式是不友好的。另一种方法就是再开一个cmd窗口,进入Jboss的bin目录,然后键入shutdown.bat -S.  这样毕竟费时费力,如果能像Linux下在命令行的后面加一个&让它在后台运行,要关闭时就不用另开窗口直接输入相应的关闭命令就好了。

    答案就在下面:

    在执行的命令前加上start /b,比如start /b run.bat。就相当于Linux下的run.sh &。



<think>我们在Python中可以通过多线程来同时执行多个外部程序(exe),每个线程负责启动一个cmd窗口并执行指定的exe程序。不过需要注意的是,默认情况下,使用`subprocess`模块运行程序时,如果使用`shell=True`,则会在新的命令行窗口中启动程序(在Windows系统中)。但是,如果我们希望每个线程都打开一个独立的cmd窗口,我们可以使用`subprocess.Popen`并设置`creationflags=subprocess.CREATE_NEW_CONSOLE`(仅Windows)来为每个进程创建新的控制台窗口。 但是,根据用户提供的引用,尤其是引用[1]中的代码,我们看到它使用了`subprocess.run`但没有创建新窗口。实际上,在Windows中,如果我们想要为每个子进程创建一个新的控制台窗口,我们需要设置`creationflags`参数为`CREATE_NEW_CONSOLE`(即`0x00000010`)。另外,需要注意的是,如果使用`subprocess.run`,它会等待命令执行完成,这会导致线程阻塞直到命令结束。如果我们希望同时运行多个命令,并且每个命令都在自己的cmd窗口运行,那么我们可以使用`subprocess.Popen`,并且设置`creationflags`。 以下是参考引用[1]和引用[5]中的方法,结合多线程,实现在多个独立的cmd窗口中同时运行多个exe程序的示例代码: 步骤: 1. 导入必要的模块:`threading`和`subprocess`。 2. 定义一个函数,该函数用于执行一个外部程序,并在新的cmd窗口中打开。 3. 创建多个线程,每个线程调用该函数来执行一个exe程序。 4. 启动所有线程,并等待所有线程完成(注意:每个线程会启动一个外部进程,但线程会等待该外部进程结束,所以需要根据实际情况考虑是否要等待)。 但是,请注意:每个线程会创建一个新的进程,并且每个进程都会有自己的控制台窗口。在Windows中,我们可以使用`subprocess.CREATE_NEW_CONSOLE`标志来创建新窗口。 示例代码(适用于Windows): ```python import threading import subprocess def run_exe(cmd): # 使用Popen并设置CREATE_NEW_CONSOLE来创建新控制台窗口 # 注意:shell=True在Windows下通常也会打开新窗口,但为了明确,我们加上CREATE_NEW_CONSOLE process = subprocess.Popen(cmd, shell=True, creationflags=subprocess.CREATE_NEW_CONSOLE) # 等待进程结束,这样线程就会一直等待直到该exe执行完成 process.wait() if __name__ == "__main__": # 假设我们有多个exe程序的命令(这里用示例命令) # 注意:每个cmd是一个字符串,可以是一个exe的完整路径,也可以是命令 exe_commands = [ "C:/Program Files/MyApp/app1.exe arg1 arg2", "app2.exe", "python another_script.py" ] threads = [] for cmd in exe_commands: t = threading.Thread(target=run_exe, args=(cmd,)) threads.append(t) t.start() # 等待所有线程完成 for t in threads: t.join() print("所有cmd窗口执行完毕") ``` 注意: - 上述代码中,`run_exe`函数使用`subprocess.Popen`并设置`creationflags=subprocess.CREATE_NEW_CONSOLE`来确保每个进程都在新的控制台窗口运行。然后调用`wait()`方法等待进程结束。 - 由于每个线程都在等待自己的进程结束,所以主线程等待所有子线程结束就意味着所有外部程序都已经执行完毕。 - 在Windows上,`CREATE_NEW_CONSOLE`标志是有效的。在其他操作系统上,这个标志无效,需要不同的方式(如使用终模拟器)来打开新窗口,但问题中要求的是cmd窗口,所以主要针对Windows。 另一种方法,如果我们不希望线程等待外部进程结束(即线程启动进程后就结束线程),那么我们可以不调用`wait()`,但是这样我们就无法知道线程何时结束(外部进程还在运行,但线程已经退出了)。不过,通常我们需要等待这些外部进程,所以使用`wait`是合理的。 引用[1]中使用了`subprocess.run`,它是阻塞的,相当于`Popen`后立即`wait`。但是,它没有创建新窗口。而我们在上面的代码中通过`CREATE_NEW_CONSOLE`创建了新窗口。 另外,引用[5]中展示了如何隐藏cmd窗口,但我们的需求是打开多个cmd窗口,所以不需要隐藏。 总结:使用多线程,每个线程中使用`subprocess.Popen`并设置`creationflags=subprocess.CREATE_NEW_CONSOLE`,可以实现同时打开多个cmd窗口并执行不同的exe程序。 但是,如果用户希望在同一个脚本中同时运行多个命令行程序,并且每个程序都在独立的窗口运行,那么上述方法就适用。 注意:由于创建了新窗口,所以程序运行时会弹出多个命令行窗口。 如果我们不希望弹出窗口(即后台运行),那么可以设置`creationflags=subprocess.CREATE_NO_WINDOW`(或者使用`STARTUPINFO`来隐藏窗口,如引用[5])。但问题要求是多个cmd窗口,所以我们选择创建新窗口。 另外,关于线程数:我们可以根据exe_commands列表的长度来创建相应数量的线程。但是,如果同时运行的线程数量很大,我们需要考虑线程数量限制(虽然每个线程大部分时间在等待外部进程,但线程过多可能会影响性能)。这种情况下,可以考虑使用线程池来控制并发数量。 不过,问题中要求同时执行2个及以上的cmd,所以线程数量不会太多,直接使用上述方法即可。 相关问题: 1. 如何在Python中隐藏执行外部程序的cmd窗口? 2. 使用Python多线程运行外部程序时,如何限制同时打开的窗口数量(即控制并发数)? 3. 除了多线程,还有哪些方法可以在Python中同时运行多个外部程序? 根据引用[1]、[5]以及我们的实现,我们提供了上述代码。 </think>### Python多线程调用多个cmd窗口执行exe程序的方法 在Python中实现多线程调用多个cmd窗口执行exe程序,核心是通过`threading`模块创建线程,结合`subprocess`模块执行外部命令。以下是具体实现方法: #### 关键步骤 1. **导入必要模块**: ```python import threading import subprocess ``` 2. **定义线程执行函数**: 每个线程负责启动一个独立的cmd窗口执行exe程序: ```python def run_exe(exe_path, args=""): cmd = f'start cmd /k "{exe_path} {args}"' subprocess.run(cmd, shell=True) ``` - `start cmd /k`:打开新cmd窗口并保持打开状态 - `/k`参数:执行后保留命令窗口(用`/c`则执行后关闭窗口) 3. **创建并管理线程**: ```python def main(): exe_list = [ ("C:/Program1/app.exe", "--mode=fast"), ("D:/Tools/program2.exe", "-t 60"), ("E:/Utils/tool.exe", "") ] threads = [] for exe_path, args in exe_list: t = threading.Thread(target=run_exe, args=(exe_path, args)) threads.append(t) t.start() # 启动线程 for t in threads: t.join() # 等待所有线程结束 if __name__ == "__main__": main() ``` #### 关键特性说明 1. **独立窗口执行**: - 每个线程通过`start cmd`创建新窗口,确保程序在独立环境中运行 - 使用`shell=True`参数允许执行系统命令 2. **参数传递**: - 支持向exe程序传递命令行参数(如`--mode=fast`) - 空参数可用`""`占位 3. **线程管理**: - `Thread.join()`保证主线程等待所有子线程完成 - 可扩展为线程池(`ThreadPoolExecutor`)控制并发数量 #### 注意事项 1. **路径处理**: - 建议使用原始字符串(`r"C:\path"`)或双反斜杠(`"C:\\path"`) - 包含空格的路径需加引号:`"\"C:/My Program/app.exe\""` 2. **窗口行为控制**: - 替换`/k`为`/c`可使程序执行后自动关闭窗口 - 添加`/min`参数最小化启动:`start /min cmd /c ...` 3. **错误处理增强**: ```python try: subprocess.run(cmd, shell=True, check=True) except subprocess.CalledProcessError as e: print(f"执行失败: {e}") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值