python启动应用程序和终止应用程序

本文介绍如何使用Python启动和关闭应用程序,并提供脚本实例。同时,深入探讨了Python调用系统命令的方式,包括os模块、subprocess模块的使用技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

python启动应用程序和终止应用程序


1. 目的

每天上班,工作需要,电脑上需要每天开机启动一些软件,下班时候,需要关掉一些软件。一个一个打开和关闭貌似是很繁琐的,于是乎,这个脚本产生了。

2. 环境

系统环境: 
- win7-32位 
- python 2.7.9

你还需要安装pywin32。 
pip install pywin32

3. 编写脚本

启动应用程序脚本

#coding=utf-8

import win32api
#日报软件启动
win32api.ShellExecute(0, 'open', r'C:\Program Files\Pudding\Pudding.exe', '','',1)

#OA启动
win32api.ShellExecute(0, 'open', r'C:\Program Files\Tongda\ispirit\ispiritPro.exe', '','',1)

#QQ启动
win32api.ShellExecute(0, 'open', r'D:\QQ\Bin\QQ.exe', '','',1)

#......
#当然你还可以添加很多你需要启动的软件

终止应用程序脚本

#coding=utf-8

import os

#终止QQ软件
os.system("taskkill /F /IM QQ.exe")

#终止日报订餐软件
os.system("taskkill /F /IM Pudding.exe")

#终止OA软件
os.system("taskkill /F /IM ispiritPro.exe")

#......
#当然你还可以添加很多你需要终止的软件

4. 制作exe

最后把这两个脚本制作成exe程序文件,放到桌面上,每次都可以很方便的使用。


python 调用系统命令,执行命令行

python中调用系统命令的方法还是有比较多的,os/command/subprocess模块中都有方法可以做到 
对比其他语言(楼主用过的语言也不多): 
PHP:exec(),system(), 整体感觉不好用, 阻塞很难受 
java:模块功能很强大,没的说,功能与python的subprocess很相似 
(1) os.system

仅仅在一个子终端运行系统命令,而不能获取命令执行后的返回信息

(2) os.popen

该方法不但执行命令还返回执行后的信息对象

(3) 使用模块commands模块

常用的主要有两个方法:getoutput和getstatusoutput

(4)使用模块subprocess 
说到底还是subprocess最为强大,能实现很多功能: 
比如最近遇到的项目需要再python中调用shell命令,还要获取调用信息,监控调用过程,超时终止等,这就要求调用过程不阻塞,还能交互,发现subprocess完全能满足,可high了 
使用方法(文件转换为例):

time_start = time.time()
cmd = "pdf2htmlEX --no-drm 1 --embed-css 0 --embed-image 0 --embed-font 0 --split-pages 1 --fit-width 748 --css-filename html.css --dest-dir %s --embed-external-font 0 --auto-hint 1 %s" % (html_output_folder, src_file)
    cmd_list = cmd.split(" ")
    sub2 = subprocess.Popen(cmd_list)
    i = 0
    while 1:
        ret1 = subprocess.Popen.poll(sub2)
        if ret1 == 0:
            time_end = time.time()
            time_take = int(time_end - time_start + 0.5)
            with global_value_lock:
                success_ids[param[2]] = time_take
            print sub2.pid,'end'
            break
        elif ret1 is None:
            print  sub2.pid, 'running'
            if i >= max_check_time:
                time_end = time.time()
                time_take = int(time_end - time_start + 0.5)
                with global_value_lock:
                    timeout_ids[param[2]] = time_take
                sub2.kill()
                log_insert("%s%s%s" % (log_dir(output_folder), os.sep, "convert_log.txt"), src_file, "Timeout_Error", 'None')
                print "*****************Timeout_Error*****************"
                break
            time.sleep(check_time)
        else:
            time_end = time.time()
            time_take = int(time_end - time_start + 0.5)
            with global_value_lock:
                converterror_ids[param[2]] = time_take
            log_insert("%s%s%s" % (log_dir(output_folder), os.sep, "convert_log.txt"), src_file, "Process_Term_Error", str(ret1))
            print sub2.pid,'term', ret1, ret1
            break
        i += 1

!!注意:当我们直接用cmd而非cmd_list时,得到的pid并不是pdf2html起的进程,而是其父进程,切记切记

以下是Popen的一些基本用法 
Popen它的构造函数如下:

subprocess.Popen(args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=False, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0)

参数args可以是字符串或者序列类型(如:list,元组),用于指定进程的可执行文件及其参数。如果是序列类型,第一个元素通常是可执行文件的路 径。我们也可以显式的使用executeable参数来指定可执行文件的路径。在windows操作系统上,Popen通过调用 CreateProcess()来创建子进程,CreateProcess接收一个字符串参数,如果args是序列类型,系统将会通过 list2cmdline()函数将序列类型转换为字符串。

参数bufsize:指定缓冲。我到现在还不清楚这个参数的具体含义,望各个大牛指点。

参数executable用于指定可执行程序。一般情况下我们通过args参数来设置所要运行的程序。如果将参数shell设为 True,executable将指定程序使用的shell。在windows平台下,默认的shell由COMSPEC环境变量来指定。

参数stdin, stdout, stderr分别表示程序的标准输入、输出、错误句柄。他们可以是PIPE,文件描述符或文件对象,也可以设置为None,表示从父进程继承。

参数preexec_fn只在Unix平台下有效,用于指定一个可执行对象(callable object),它将在子进程运行之前被调用。

参数Close_sfs:在windows平台下,如果close_fds被设置为True,则新创建的子进程将不会继承父进程的输入、输出、错误管 道。我们不能将close_fds设置为True同时重定向子进程的标准输入、输出与错误(stdin, stdout, stderr)。

如果参数shell设为true,程序将通过shell来执行。

参数cwd用于设置子进程的当前目录。

参数env是字典类型,用于指定子进程的环境变量。如果env = None,子进程的环境变量将从父进程中继承。

参数Universal_newlines:不同操作系统下,文本的换行符是不一样的。如:windows下用’/r/n’表示换,而Linux下用 ‘/n’。如果将此参数设置为True,Python统一把这些换行符当作’/n’来处理。

参数startupinfo与createionflags只在windows下用效,它们将被传递给底层的CreateProcess()函数,用 于设置子进程的一些属性,如:主窗口的外观,进程的优先级等等。

subprocess.PIPE 
在创建Popen对象时,subprocess.PIPE可以初始化stdin, stdout或stderr参数。表示与子进程通信的标准流。

subprocess.STDOUT 
创建Popen对象时,用于初始化stderr参数,表示将错误通过标准输出流输出。

Popen的方法:

Popen.poll() 
用于检查子进程是否已经结束。设置并返回returncode属性。

Popen.wait() 
等待子进程结束。设置并返回returncode属性。

Popen.communicate(input=None) 
与子进程进行交互。向stdin发送数据,或从stdout和stderr中读取数据。可选参数input指定发送到子进程的参数。 Communicate()返回一个元组:(stdoutdata, stderrdata)。注意:如果希望通过进程的stdin向其发送数据,在创建Popen对象的时候,参数stdin必须被设置为PIPE。同样,如 果希望从stdout和stderr获取数据,必须将stdout和stderr设置为PIPE。

Popen.send_signal(signal) 
向子进程发送信号。

Popen.terminate() 
停止(stop)子进程。在windows平台下,该方法将调用Windows API TerminateProcess()来结束子进程。

Popen.kill() 
杀死子进程。

Popen.stdin 
如果在创建Popen对象是,参数stdin被设置为PIPE,Popen.stdin将返回一个文件对象用于策子进程发送指令。否则返回None。

Popen.stdout 
如果在创建Popen对象是,参数stdout被设置为PIPE,Popen.stdout将返回一个文件对象用于策子进程发送指令。否则返回 None。

Popen.stderr 
如果在创建Popen对象是,参数stdout被设置为PIPE,Popen.stdout将返回一个文件对象用于策子进程发送指令。否则返回 None。

Popen.pid 
获取子进程的进程ID。

Popen.returncode 
获取进程的返回值。如果进程还没有结束,返回None。


<think>我们被要求使用Python启动或打开应用程序。根据引用内容,有几种方法可以实现: 1. 使用`win32api.ShellExecute`(仅Windows) 2. 使用`subprocess`模块(跨平台) 3. 使用`os.system`(跨平台,但较简单) 4. 使用`os.startfile`(仅Windows) 另外,用户之前的问题是关于打开紫鸟浏览器(ziniao.exe),但当前问题是一般性的:如何用Python启动或打开应用程序。 我们将介绍几种常用方法,并给出示例。 ### 方法1:使用`subprocess`模块(推荐跨平台) `subprocess`模块可以创建新进程,连接它们的输入/输出/错误管道,并获取它们的返回码。 **示例代码:** ```python import subprocess # 打开记事本(Windows) subprocess.Popen(['notepad.exe']) # 打开计算器(Windows) subprocess.Popen(['calc.exe']) # 打开指定路径的应用程序 # 注意:路径中包含空格时,建议使用列表形式传递参数 subprocess.Popen([r'C:\Program Files\Ziniao Browser\ziniao.exe']) # 对于Linux/macOS,打开Firefox # subprocess.Popen(['firefox']) ``` ### 方法2:使用`os.startfile`(仅Windows) 此方法仅适用于Windows,它使用关联的程序打开文件或启动应用程序。 **示例代码:** ```python import os # 打开记事本 os.startfile('notepad.exe') # 打开指定路径的应用程序 os.startfile(r'C:\Program Files\Ziniao Browser\ziniao.exe') # 也可以用此方法打开文件,比如打开一个PDF # os.startfile('document.pdf') ``` ### 方法3:使用`win32api.ShellExecute`(仅Windows) 需要安装`pywin32`库(`pip install pywin32`)。 **示例代码:** ```python import win32api # 启动应用程序 win32api.ShellExecute(0, 'open', r'C:\Program Files\Ziniao Browser\ziniao.exe', '', '', 1) ``` 参数说明: - 第一个参数:父窗口句柄(0表示无) - 第二个参数:操作('open'表示打开) - 第三个参数:要执行的文件路径 - 第四个参数:参数(如果应用程序需要参数,则传入) - 第五个参数:工作目录(空字符串表示当前目录) - 第六个参数:显示窗口的方式(1表示正常显示) ### 方法4:使用`os.system`(跨平台,但功能有限) 此方法会执行一条系统命令,并等待命令执行完成。 **示例代码:** ```python import os # Windows os.system('notepad.exe') # Linux/macOS # os.system('firefox') # 打开指定路径的应用程序(注意路径有空格时需要加引号) os.system(r'"C:\Program Files\Ziniao Browser\ziniao.exe"') ``` ### 方法比较 | 方法 | 平台 | 特点 | |------|------|------| | `subprocess.Popen` | 跨平台 | 功能强大,可控制进程,不阻塞当前程序 | | `os.startfile` | 仅Windows | 简单,只能打开文件或程序,不阻塞 | | `win32api.ShellExecute` | 仅Windows | 功能丰富,可指定窗口显示方式 | | `os.system` | 跨平台 | 简单,但会阻塞当前程序直到启动的程序退出 | ### 终止应用程序 有时我们还需要终止启动应用程序。根据引用[2],我们可以通过以下方式终止: **Windows:** - 使用任务管理器手动终止 - 使用Python代码终止(需要知道进程ID或进程名) **使用`psutil`库终止进程(跨平台):** ```python import psutil # 通过进程名终止 for proc in psutil.process_iter(): if proc.name() == 'ziniao.exe': proc.kill() ``` **使用`os.kill`(仅Linux/macOS)或`signal`模块:** 这里不展开,因为用户问题主要是启动。 ### 注意事项 1. 路径中的空格:在字符串中,如果路径包含空格,最好使用原始字符串(加`r`前缀)并用引号括起来(当使用`os.system`时)。 2. 环境变量:如果应用程序在系统环境变量中,可以直接使用名称(如`notepad.exe`)。否则,需要提供完整路径。 3. 工作目录:有些应用程序需要从特定目录启动,可以使用`cwd`参数(在`subprocess.Popen`中)。 ```python subprocess.Popen('app.exe', cwd=r'C:\path\to\app') ``` ### 总结 - 对于跨平台需求,优先使用`subprocess.Popen`。 - 仅Windows且简单打开,可使用`os.startfile`或`win32api.ShellExecute`。 - 如果只需要简单执行命令并等待完成,可使用`os.system`。 §§相关问题§§ 1. 如何用Python获取正在运行的应用程序列表? 2. Python如何以管理员权限启动应用程序? 3. 如何用Python隐藏启动应用程序的控制台窗口?</think>### Python启动应用程序的多种方法 Python提供了多种启动外部应用程序的方法,以下是常用的几种实现方式: #### 1. 使用`subprocess`模块(跨平台推荐) ```python import subprocess # 启动记事本 subprocess.Popen(['notepad.exe']) # 启动带空格的路径(使用原始字符串) subprocess.Popen([r'C:\Program Files\Ziniao Browser\ziniao.exe']) # 启动并隐藏控制台窗口(Windows) subprocess.Popen(['calc.exe'], creationflags=subprocess.CREATE_NO_WINDOW) ``` > 特点:跨平台支持,可控制进程输入/输出流[^4] #### 2. 使用`os.startfile`(仅Windows) ```python import os # 启动应用程序 os.startfile(r'C:\Program Files\Ziniao Browser\ziniao.exe') # 打开关联文件 os.startfile('document.pdf') # 用默认程序打开PDF ``` > 特点:简洁高效,但仅限Windows系统[^4] #### 3. 使用`win32api.ShellExecute`(Windows高级控制) ```python import win32api # 启动应用程序并显示窗口 win32api.ShellExecute(0, 'open', r'C:\Program Files\Ziniao Browser\ziniao.exe', '', '', 1) # 最小化启动 win32api.ShellExecute(0, 'open', 'notepad.exe', 'report.txt', '', 0) ``` > 参数说明: > `0`-父窗口句柄 > `'open'`-操作类型 > `1`-显示窗口(1=正常,0=隐藏) > 需要安装`pywin32`库[^3] #### 4. 使用`os.system`(简单命令执行) ```python import os # 启动计算器 os.system('calc.exe') # Linux启动Firefox os.system('firefox --private-window https://example.com') ``` > 注意:路径含空格需加引号 > `os.system(r'"C:\Program Files\App\app.exe"')`[^2] #### 5. 启动Android应用(Kivy框架) ```python from kivy.app import App class MyApp(App): def build(self): # 创建应用界面 return Button(text='启动应用') if __name__ == '__main__': MyApp().run() # 打包为APK后可在Android运行 ``` > 使用Kivy框架可构建跨平台应用[^5] ### 终止应用程序的方法 ```python import psutil # 通过进程名终止 for proc in psutil.process_iter(): if proc.name() == 'ziniao.exe': proc.kill() # 通过PID终止 import os os.kill(pid, 9) # Linux/macOS ``` ### 最佳实践建议 1. **路径处理**:使用原始字符串避免转义问题 `r'C:\Program Files\App\app.exe'` 2. **权限管理**:需要管理员权限时 ```python import ctypes if ctypes.windll.shell32.IsUserAnAdmin() == 0: ctypes.windll.shell32.ShellExecuteW(None, "runas", sys.executable, __file__, None, 1) ``` 3. **跨平台兼容**: ```python import platform if platform.system() == 'Windows': # Windows专用代码 else: # Linux/macOS代码 ``` 4. **等待进程结束**: ```python proc = subprocess.Popen(['ping', 'example.com']) proc.wait() # 阻塞直到完成 ``` ### 方法对比表 | 方法 | 平台支持 | 复杂度 | 控制能力 | 适用场景 | |------|----------|--------|----------|----------| | `subprocess` | 全平台 | 中 | ⭐⭐⭐⭐ | 需要进程控制的场景 | | `os.startfile` | Windows | 低 | ⭐ | 快速打开文件/应用 | | `win32api` | Windows | 高 | ⭐⭐⭐⭐⭐ | 需要精细控制窗口 | | `os.system` | 全平台 | 低 | ⭐ | 简单命令执行 | | Kivy框架 | 移动端 | 高 | ⭐⭐⭐ | 构建Android应用 | > 提示:商业应用如紫鸟浏览器可能有反自动化检测,建议配合`--user-data-dir`参数使用独立配置文件[^1]
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值