记录博客 ZH-BLOG

Python subprocess 模块

时间:2018-07-24 17:02:13分类:python

利用 subprocess 模块启动计算机中的 其他程序

>>> import subprocess
>>> subprocess.Popen('C:\\Windows\\System32\\calc.exe')

import subprocess

pro=subprocess.Popen('C:\\Windows\\System32\\calc.exe')
print(pro.poll())   # None 如果进程死亡返回 returncode
print(pro.poll() is None) # True
print(pro.wait())   # 子进程未关闭时,程序阻塞等待状态;关闭子程序后,输出0
print(pro.poll())   # 0

传递参数

# 传递参数
pro=subprocess.Popen([r'D:\work\Notepad++\notepad++.exe','C:\\Users\\Administrator\\Desktop\\wp.txt'])

使用默认程序打开

# 使用默认程序打开,类型双击操作
subprocess.Popen(['start','C:\\Users\\Administrator\\Desktop\\wp.txt'],shell=True)

练习:使用迅雷下载 torrent 种子中的文件

import os,subprocess,time
import torrent_parser

def parse_torrent(torrent_file_path):
    """
    典型的、基础的eD2k文件链接只包含必要的三样信息:文件名、文件大小、文件的eD2k Hash。形如:
    ed2k://|file|<文件名>|<文件大小>|<文件Hash>|/
    以下是大小为2868871字节(约2.7MB)的官方eMule v0.49c zip压缩包的eD2k链接的例子[1]:

    ed2k://|file|eMule0.49c.zip|2868871|0F88EEFA9D8AD3F43DABAC9982D2450C|/
    :param torrent_file_path:
    :return: list
    """
    file_list=[]
    torrent_data = torrent_parser.parse_torrent_file(torrent_file_path)
    files = torrent_data['info']['files']
    for file_dict in files:
        if 'ed2k' in file_dict:
            print(file_dict['ed2k'], end=' ')
        else:
            continue
        if 'filehash' in file_dict:
            print(file_dict['filehash'], end=' ')
        if 'length' in file_dict:
            print(file_dict['length'], end=' ')
        if 'path' in file_dict:
            print(file_dict['path'])
        file_list.append('ed2k://|file|%s|%s|%s|/'%(file_dict['path'],file_dict['length'],file_dict['ed2k']))
    return file_list

# 目前只能下载单个文件,多文件需要点击确定下载
# pro=subprocess.call([r'D:\Program Files (x86)\Thunder Network\Thunder\Program\Thunder.exe',os.path.join('E:\\','path','tr.torrent')])
# if pro: # 成功
#     print('启动迅雷')

file_list=parse_torrent(os.path.join('E:\\','path','tr.torrent'))
xunlei_process=subprocess.Popen(r'D:\Program Files (x86)\Thunder Network\Thunder\Program\Thunder.exe')
# xunlei_process.wait() # 等待进程终结
# xunlei_process.poll() # 查看进程是否终结,返回终结码,否则返回None
print('启动迅雷...')
for file_url in file_list:
    subprocess.Popen([r'D:\Program Files (x86)\Thunder Network\Thunder\Program\Thunder.exe',file_url])
    time.sleep(5)