Python练习:调用其它程序

题目1

请百度搜索并安装文本编辑器notepad++。

并且写一个Python程序,实现:

  • 用命令行启动 notepad++ 编辑器打开当前的代码文件。

  • 过10秒后用Windows下的命令 tasklist 找到该notepad++进程,并获取其进程ID

  • 根据 其进程ID 使用命令 taskkill 杀死notepad++进程。

如何使用这两个命令可以参考该文章 http://tweaks.com/windows/39559/kill-processes-from-command-prompt/

答案与解析

















































题目1-答案

# notepad++程序路径, 由于路径中有空格
# 所以需要双引号括起来,这是Windows shell的语法
notepadexepath = r'"d:\Program Files (x86)\Notepad++\notepad++.exe"'

# 当前代码文件的路径
scriptpath = r'E:\t1.py'


from subprocess  import Popen,PIPE
import time,sys,os

# 调用notepad++ 打开 当前代码文件
cmd = f'{notepadexepath} {scriptpath}'

# 注意,不能用os.system 因为 我们的程序不能等notepad++退出
p = Popen(args=cmd, shell=True)

time.sleep(10)


# 返回的是 Popen 实例对象
p = Popen(
    'tasklist',
    stdin  = None,
    stdout = PIPE,
    stderr = None,
    shell=True)

# communicate 方法返回 输出信息
outinfo, errinfo = p.communicate()

# 注意返回的内容是bytes 不是 str ,
# 我的是中文windows,所以用gbk解码
outinfo = outinfo.decode('gbk')
# print (outinfo) 

# 在输出中,寻找 notepad++ 的 进程ID
pid = None
proclist = outinfo.splitlines()
for pinfo in proclist:
    if 'notepad++.exe '  in pinfo:
        print(pinfo)

        infolist = pinfo.split(' ')
        
        # 去掉其中的空信息
        infolist = [info for info in infolist if info]
        
        # 进程ID是第2个元素
        pid = infolist[1]
        print(f'notepad++的进程ID是{pid}')
        break

if pid is None:
    print('对不起,没有发现notepad++的进程ID')
    sys.exit(2)

# 杀掉进程
os.system(f'taskkill /PID {pid} /F')