python实例分享:多进程同时给多台手机copy文件(based on python3.6.5)


由于近期的工作过程中,有以下需求,需要将相同的升级包copy至100多台手机的根目录,是一个繁重而枯燥的工作。如果一台一台的通过mtk来复制,耗的时间应该要很久,如是想到:能不能写个小程序,实现一键同时多进程给4台手机copy呢?


当有以下这种需求时刚好可以用用这个tool(限android平台+python3.6.x)


>>>重要提示 --请将待copy文件放置在桌面再进行操作<<<
如要将PC上一个大文件复现到N台手机的根目录时,如果单台的Copy效率很慢;
如用这个Tool, 可多台手机同时连接PC,只要确保每台手机adb连接成功;
run Copyfile2phone.py,就可以多进程同时给多台手机复制文件,减少花在Copy文件上的总时间


第一次run时,会在py同目录下自动新建一个coyfile2phyone.txt,并要求输入待copy的文件名;
建议将要copy的文件直接拖入,会自动获取文件名并写入txt档中;
下次run就会自动读取写入的文件名,不再要求输入待copy的文件名。
#!/user/bin/python
# -*- coding:utf-8 -*-

import os
from multiprocessing import Pool

# 获取username,  如chinaren
def getusername():
    namelist = os.popen('echo %username%').readlines()
    username = namelist[0].replace("\n", "")
    # 获取当前的username
    return username

# 获取设备id列表
def getdevlist():
    devlist = []
    connectfile = os.popen('adb devices')
    list = connectfile.readlines()
    # print(list)
    for i in range(len(list)):
        if list[i].find('\tdevice') != -1:
            temp = list[i].split('\t')
            devlist.append(temp[0])
    return devlist


# 返回指定txt文件的第一行内容,主要是为了获取待Copy的文件名
def getspecifytxtfilefirstline(txtfilename):
    '''
    返回指定txt文件的第一行内容
    txt档要求与py档在同一目录
    '''
    currunningpyfilepath = os.path.split(os.path.realpath(__file__))[0]
    copyfile2phoneTXT = currunningpyfilepath + '\\' + txtfilename
    while (True):
        if os.path.exists(copyfile2phoneTXT) == True:
            with open(copyfile2phoneTXT, 'r') as f:
                filename = f.readline()
            if filename == '':
                print('txt档为空,输入重新写入待copy文件名.')
                f.close()
                f = open(copyfile2phoneTXT, 'w')
                fileStr = input('请输入你要copy文件的完整文件名\n(建议直接拖入文件至这里,会自动获取写入txt档):')
                filenamelist = fileStr.split('\\')
                filename = filenamelist[len(filenamelist) - 1]
                f.write(filename)
                f.close()
                print('输入的文件名已写入.')
                return filename
            else:
                return filename
        else:
            print('copyfile2phone.txt文件不存在,将在当前目录新建一个此txt文件!')
            f = open(copyfile2phoneTXT, 'w')
            print('copyfile2phone.txt文件新建成功!')
            fileStr = input('请输入你要copy文件的完整文件名\n(建议直接拖入文件至这里,会自动获取写入txt档):')
            filenamelist = fileStr.split('\\')
            filename = filenamelist[len(filenamelist) - 1]
            f.write(filename)
            f.close()
            print('输入的文件名已写入.')
            return filename

# 测试Adb连接性
def checkAdbConnectability(flag=0):
    '''
    flag =0时,当连接正常时返回True(default)
    flag!=0时,直接打印出结果
    '''
    connectstring = '''ADB连接失败, 请check以下项:
    1. 是否有连接上手机?请连接上手机选并重新check连接性!
    2. 是否有开启"开发者选项\\USB调试模式"?\n'''
    connectinfolist = getdevlist()

    if len(connectinfolist) == 0:
        print(connectstring)
        return False
    if len(connectinfolist) == 1:
        if flag != 0:
            print('连接正常')
            print(f'设备SN: {connectinfolist[0]}')
        else:
            return True
    if len(connectinfolist) >= 2:
        print('连接正常,但当前有连接多台设备,请确保只连接一台才能正常操作. ')
        for i in range(len(connectinfolist)):
            print(f'设备{i + 1} SN: {connectinfolist[i]}')
        return True


# Copy文件操作
def copyfile_task(deviceid, filename):
    copyfilepath = 'C:\\Users\\' + getusername() + '\\Desktop\\' + filename
    print(f'设备{deviceid}准备执行copy操作!')
    cmd = 'adb -s ' + deviceid + ' push ' + copyfilepath + ' /sdcard/'
    # print(cmd)
    if os.system(cmd) == 0:
        print(f'设备{deviceid} 文件copy成功!\n')


def main():
    print('---------重要提示---------')
    print('请将待Copy文件放置在桌面再进行操作\n\n')
    while (True):
        copyfilename = getspecifytxtfilefirstline('copyfile2phone.txt')
        if checkAdbConnectability() == True:
            copyfilepath = 'C:\\Users\\' + getusername() + '\\Desktop\\' + copyfilename
            if os.path.isfile(copyfilepath) == True:
                print(f'要copy的文件名:{copyfilename}\n')
                print('COPY文件,请稍候... ...\n')
                p = Pool(4)
                devicelist = getdevlist()
                for i in range(len(devicelist)):
                    p.apply_async(copyfile_task, args=(devicelist[i], copyfilename))
                p.close()
                p.join()
                print('所有的copy动作已完成!')
                os.system('pause')
                return
            else:
                print('TXT档中指定的文件名不存在TXT档将被删除并新建,需要重新输入文件名:')
                # 删除文件
                curfilepath = os.path.split(os.path.realpath(__file__))[0]
                TXTfilepath = curfilepath + '\\' + 'copyfile2phone.txt'
                os.remove(TXTfilepath)
                print('TXT档被删除成功')
        else:
            break

# 主程序
if __name__ == '__main__':
    main()


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值