python常用模块及其方法[os/os.paht/stat/sys/datetime/hashlib/md5/random/types/atexit/string/urllib/re/math]...

本文概述了 Python 中常用的核心模块及其主要功能,包括 os 模块的文件与目录操作、sys 模块的系统相关操作、datetime 模块的时间处理等。适合初学者快速了解 Python 的内置功能。
  1. ********************  
  2. PY核心模块方法  
  3. ********************  
  4. os模块:  
  5.     os.remove()         删除文件   
  6.     os.unlink()         删除文件   
  7.     os.rename()         重命名文件   
  8.     os.listdir()        列出指定目录下所有文件   
  9.     os.chdir()          改变当前工作目录  
  10.     os.getcwd()         获取当前文件路径  
  11.     os.mkdir()          新建目录  
  12.     os.rmdir()          删除空目录(删除非空目录, 使用shutil.rmtree())  
  13.     os.makedirs()       创建多级目录  
  14.     os.removedirs()     删除多级目录  
  15.     os.stat(file)       获取文件属性  
  16.     os.chmod(file)      修改文件权限  
  17.     os.utime(file)      修改文件时间戳  
  18.     os.name(file)       获取操作系统标识  
  19.     os.system()         执行操作系统命令  
  20.     os.execvp()         启动一个新进程  
  21.     os.fork()           获取父进程ID,在子进程返回中返回0  
  22.     os.execvp()         执行外部程序脚本(Uinx)  
  23.     os.spawn()          执行外部程序脚本(Windows)  
  24.     os.access(path, mode) 判断文件权限(详细参考cnblogs)  
  25.     os.wait()           暂时未知  
  26. os.path模块:  
  27.     os.path.split(filename)         将文件路径和文件名分割(会将最后一个目录作为文件名而分离)  
  28.     os.path.splitext(filename)      将文件路径和文件扩展名分割成一个元组  
  29.     os.path.dirname(filename)       返回文件路径的目录部分  
  30.     os.path.basename(filename)      返回文件路径的文件名部分  
  31.     os.path.join(dirname,basename)  将文件路径和文件名凑成完整文件路径  
  32.     os.path.abspath(name)           获得绝对路径  
  33.     os.path.splitunc(path)          把路径分割为挂载点和文件名  
  34.     os.path.normpath(path)          规范path字符串形式  
  35.     os.path.exists()                判断文件或目录是否存在  
  36.     os.path.isabs()                 如果path是绝对路径,返回True  
  37.     os.path.realpath(path)          #返回path的真实路径  
  38.     os.path.relpath(path[, start])  #从start开始计算相对路径     
  39.     os.path.normcase(path)          #转换path的大小写和斜杠  
  40.     os.path.isdir()                 判断name是不是一个目录,name不是目录就返回false  
  41.     os.path.isfile()                判断name是不是一个文件,不存在返回false  
  42.     os.path.islink()                判断文件是否连接文件,返回boolean  
  43.     os.path.ismount()               指定路径是否存在且为一个挂载点,返回boolean  
  44.     os.path.samefile()              是否相同路径的文件,返回boolean  
  45.     os.path.getatime()              返回最近访问时间 浮点型  
  46.     os.path.getmtime()              返回上一次修改时间 浮点型  
  47.     os.path.getctime()              返回文件创建时间 浮点型  
  48.     os.path.getsize()               返回文件大小 字节单位  
  49.     os.path.commonprefix(list)      #返回list(多个路径)中,所有path共有的最长的路径  
  50.     os.path.lexists                 #路径存在则返回True,路径损坏也返回True  
  51.     os.path.expanduser(path)        #把path中包含的"~"和"~user"转换成用户目录  
  52.     os.path.expandvars(path)        #根据环境变量的值替换path中包含的”$name”和”${name}”  
  53.     os.path.sameopenfile(fp1, fp2)  #判断fp1和fp2是否指向同一文件  
  54.     os.path.samestat(stat1, stat2)  #判断stat tuple stat1和stat2是否指向同一个文件  
  55.     os.path.splitdrive(path)        #一般用在windows下,返回驱动器名和路径组成的元组  
  56.     os.path.walk(path, visit, arg)  #遍历path,给每个path执行一个函数详细见手册  
  57.     os.path.supports_unicode_filenames()     设置是否支持unicode路径名  
  58. stat模块:  
  59.     描述os.stat()返回的文件属性列表中各值的意义  
  60.     fileStats = os.stat(path)        获取到的文件属性列表  
  61.     fileStats[stat.ST_MODE]          获取文件的模式  
  62.     fileStats[stat.ST_SIZE]          文件大小  
  63.     fileStats[stat.ST_MTIME]         文件最后修改时间  
  64.     fileStats[stat.ST_ATIME]         文件最后访问时间  
  65.     fileStats[stat.ST_CTIME]         文件创建时间  
  66.     stat.S_ISDIR(fileStats[stat.ST_MODE])       是否目录  
  67.     stat.S_ISREG(fileStats[stat.ST_MODE])       是否一般文件  
  68.     stat.S_ISLNK(fileStats[stat.ST_MODE])       是否连接文件  
  69.     stat.S_ISSOCK(fileStats[stat.ST_MODE])      是否COCK文件  
  70.     stat.S_ISFIFO(fileStats[stat.ST_MODE])      是否命名管道  
  71.     stat.S_ISBLK(fileStats[stat.ST_MODE])       是否块设备  
  72.     stat.S_ISCHR(fileStats[stat.ST_MODE])       是否字符设置  
  73. sys模块:  
  74.     sys.argv                命令行参数List,第一个元素是程序本身路径   
  75.     sys.path                返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值   
  76.     sys.modules.keys()      返回所有已经导入的模块列表  
  77.     sys.modules             返回系统导入的模块字段,key是模块名,value是模块   
  78.     sys.exc_info()          获取当前正在处理的异常类,exc_type、exc_value、exc_traceback当前处理的异常详细信息  
  79.     sys.exit(n)             退出程序,正常退出时exit(0)  
  80.     sys.hexversion          获取Python解释程序的版本值,16进制格式如:0x020403F0  
  81.     sys.version             获取Python解释程序的版本信息  
  82.     sys.platform            返回操作系统平台名称  
  83.     sys.stdout              标准输出  
  84.     sys.stdout.write('aaa') 标准输出内容  
  85.     sys.stdout.writelines() 无换行输出  
  86.     sys.stdin               标准输入  
  87.     sys.stdin.read()        输入一行  
  88.     sys.stderr              错误输出  
  89.     sys.exc_clear()         用来清除当前线程所出现的当前的或最近的错误信息   
  90.     sys.exec_prefix         返回平台独立的python文件安装的位置   
  91.     sys.byteorder           本地字节规则的指示器,big-endian平台的值是'big',little-endian平台的值是'little'   
  92.     sys.copyright           记录python版权相关的东西   
  93.     sys.api_version         解释器的C的API版本   
  94.     sys.version_info        'final'表示最终,也有'candidate'表示候选,表示版本级别,是否有后继的发行   
  95.     sys.getdefaultencoding()        返回当前你所用的默认的字符编码格式   
  96.     sys.getfilesystemencoding()     返回将Unicode文件名转换成系统文件名的编码的名字   
  97.     sys.builtin_module_names        Python解释器导入的内建模块列表   
  98.     sys.executable                  Python解释程序路径   
  99.     sys.getwindowsversion()         获取Windows的版本   
  100.     sys.stdin.readline()            从标准输入读一行,sys.stdout.write("a") 屏幕输出a  
  101.     sys.setdefaultencoding(name)    用来设置当前默认的字符编码(详细使用参考文档)   
  102.     sys.displayhook(value)          如果value非空,这个函数会把他输出到sys.stdout(详细使用参考文档)  
  103.   
  104. datetime,date,time模块:  
  105.     datetime.date.today()           本地日期对象,(用str函数可得到它的字面表示(2014-03-24))  
  106.     datetime.date.isoformat(obj)    当前[年-月-日]字符串表示(2014-03-24)  
  107.     datetime.date.fromtimestamp()   返回一个日期对象,参数是时间戳,返回 [年-月-日]  
  108.     datetime.date.weekday(obj)      返回一个日期对象的星期数,周一是0  
  109.     datetime.date.isoweekday(obj)   返回一个日期对象的星期数,周一是1  
  110.     datetime.date.isocalendar(obj)  把日期对象返回一个带有年月日的元组  
  111.     datetime对象:  
  112.     datetime.datetime.today()       返回一个包含本地时间(含微秒数)的datetime对象 2014-03-24 23:31:50.419000  
  113.     datetime.datetime.now([tz])     返回指定时区的datetime对象 2014-03-24 23:31:50.419000  
  114.     datetime.datetime.utcnow()      返回一个零时区的datetime对象  
  115.     datetime.fromtimestamp(timestamp[,tz])      按时间戳返回一个datetime对象,可指定时区,可用于strftime转换为日期表示   
  116.     datetime.utcfromtimestamp(timestamp)        按时间戳返回一个UTC-datetime对象  
  117.     datetime.datetime.strptime('2014-03-16 12:21:21',"%Y-%m-%d %H:%M:%S") 将字符串转为datetime对象  
  118.     datetime.datetime.strftime(datetime.datetime.now(), '%Y%m%d %H%M%S') 将datetime对象转换为str表示形式  
  119.     datetime.date.today().timetuple()           转换为时间戳datetime元组对象,可用于转换时间戳  
  120.     datetime.datetime.now().timetuple()  
  121.     time.mktime(timetupleobj)                   将datetime元组对象转为时间戳  
  122.     time.time()                     当前时间戳  
  123.     time.localtime  
  124.     time.gmtime  
  125.   
  126.       
  127. hashlib,md5模块:  
  128.     hashlib.md5('md5_str').hexdigest()      对指定字符串md5加密  
  129.     md5.md5('md5_str').hexdigest()          对指定字符串md5加密  
  130.       
  131. random模块:  
  132.     random.random()             产生0-1的随机浮点数  
  133.     random.uniform(a, b)        产生指定范围内的随机浮点数  
  134.     random.randint(a, b)        产生指定范围内的随机整数  
  135.     random.randrange([start], stop[, step]) 从一个指定步长的集合中产生随机数  
  136.     random.choice(sequence)     从序列中产生一个随机数  
  137.     random.shuffle(x[, random]) 将一个列表中的元素打乱  
  138.     random.sample(sequence, k)  从序列中随机获取指定长度的片断  
  139.    
  140. types模块:  
  141.     保存了所有数据类型名称。  
  142.     if type('1111') == types.StringType:  
  143. MySQLdb模块:  
  144.     MySQLdb.get_client_info()           获取API版本  
  145.     MySQLdb.Binary('string')            转为二进制数据形式  
  146.     MySQLdb.escape_string('str')        针对mysql的字符转义函数  
  147.     MySQLdb.DateFromTicks(1395842548)   把时间戳转为datetime.date对象实例  
  148.     MySQLdb.TimestampFromTicks(1395842548)   把时间戳转为datetime.datetime对象实例  
  149.     MySQLdb.string_literal('str')       字符转义  
  150.     MySQLdb.cursor()游标对象上的方法:《python核心编程》P624  
  151.       
  152. atexit模块:  
  153.     atexit.register(fun,args,args2..)   注册函数func,在解析器退出前调用该函数  
  154.   
  155.       
  156. string模块:  
  157.     str.capitalize()            把字符串的第一个字符大写  
  158.     str.center(width)           返回一个原字符串居中,并使用空格填充到width长度的新字符串  
  159.     str.ljust(width)            返回一个原字符串左对齐,用空格填充到指定长度的新字符串  
  160.     str.rjust(width)            返回一个原字符串右对齐,用空格填充到指定长度的新字符串  
  161.     str.zfill(width)            返回字符串右对齐,前面用0填充到指定长度的新字符串  
  162.     str.count(str,[beg,len])    返回子字符串在原字符串出现次数,beg,len是范围  
  163.     str.decode(encodeing[,replace]) 解码string,出错引发ValueError异常  
  164.     str.encode(encodeing[,replace]) 解码string  
  165.     str.endswith(substr[,beg,end])  字符串是否以substr结束,beg,end是范围  
  166.     str.startswith(substr[,beg,end])  字符串是否以substr开头,beg,end是范围  
  167.     str.expandtabs(tabsize = 8)     把字符串的tab转为空格,默认为8个  
  168.     str.find(str,[stat,end])        查找子字符串在字符串第一次出现的位置,否则返回-1  
  169.     str.index(str,[beg,end])        查找子字符串在指定字符中的位置,不存在报异常  
  170.     str.isalnum()               检查字符串是否以字母和数字组成,是返回true否则False  
  171.     str.isalpha()               检查字符串是否以纯字母组成,是返回true,否则false  
  172.     str.isdecimal()             检查字符串是否以纯十进制数字组成,返回布尔值  
  173.     str.isdigit()               检查字符串是否以纯数字组成,返回布尔值  
  174.     str.islower()               检查字符串是否全是小写,返回布尔值  
  175.     str.isupper()               检查字符串是否全是大写,返回布尔值  
  176.     str.isnumeric()             检查字符串是否只包含数字字符,返回布尔值  
  177.     str.isspace()               如果str中只包含空格,则返回true,否则FALSE  
  178.     str.title()                 返回标题化的字符串(所有单词首字母大写,其余小写)  
  179.     str.istitle()               如果字符串是标题化的(参见title())则返回true,否则false  
  180.     str.join(seq)               以str作为连接符,将一个序列中的元素连接成字符串  
  181.     str.split(str='',num)       以str作为分隔符,将一个字符串分隔成一个序列,num是被分隔的字符串  
  182.     str.splitlines(num)         以行分隔,返回各行内容作为元素的列表  
  183.     str.lower()                 将大写转为小写  
  184.     str.upper()                 转换字符串的小写为大写  
  185.     str.swapcase()              翻换字符串的大小写  
  186.     str.lstrip()                去掉字符左边的空格和回车换行符  
  187.     str.rstrip()                去掉字符右边的空格和回车换行符  
  188.     str.strip()                 去掉字符两边的空格和回车换行符  
  189.     str.partition(substr)       从substr出现的第一个位置起,将str分割成一个3元组。  
  190.     str.replace(str1,str2,num)  查找str1替换成str2,num是替换次数  
  191.     str.rfind(str[,beg,end])    从右边开始查询子字符串  
  192.     str.rindex(str,[beg,end])   从右边开始查找子字符串位置   
  193.     str.rpartition(str)         类似partition函数,不过从右边开始查找  
  194.     str.translate(str,del='')   按str给出的表转换string的字符,del是要过虑的字符  
  195.       
  196. urllib模块:  
  197.     urllib.quote(string[,safe])             对字符串进行编码。参数safe指定了不需要编码的字符  
  198.     urllib.unquote(string)                  对字符串进行解码  
  199.     urllib.quote_plus(string[,safe])        与urllib.quote类似,但这个方法用'+'来替换' ',而quote用'%20'来代替' '  
  200.     urllib.unquote_plus(string )            对字符串进行解码  
  201.     urllib.urlencode(query[,doseq])         将dict或者包含两个元素的元组列表转换成url参数。  
  202.                                             例如 字典{'name':'wklken','pwd':'123'}将被转换为"name=wklken&pwd=123"  
  203.     urllib.pathname2url(path)               将本地路径转换成url路径  
  204.     urllib.url2pathname(path)               将url路径转换成本地路径  
  205.     urllib.urlretrieve(url[,filename[,reporthook[,data]]])  下载远程数据到本地  
  206.         filename:指定保存到本地的路径(若未指定该,urllib生成一个临时文件保存数据)  
  207.         reporthook:回调函数,当连接上服务器、以及相应的数据块传输完毕的时候会触发该回调  
  208.         data:指post到服务器的数据  
  209.     rulrs = urllib.urlopen(url[,data[,proxies]])     抓取网页信息,[data]post数据到Url,proxies设置的代理  
  210.     urlrs.readline()    跟文件对象使用一样  
  211.     urlrs.readlines()   跟文件对象使用一样  
  212.     urlrs.fileno()      跟文件对象使用一样  
  213.     urlrs.close()       跟文件对象使用一样  
  214.     urlrs.info()        返回一个httplib.HTTPMessage对象,表示远程服务器返回的头信息  
  215.     urlrs.getcode()     获取请求返回状态HTTP状态码  
  216.     urlrs.geturl()      返回请求的URL  
  217.   
  218. urllib2模块:  
  219. urlparse模块:      
  220.       
  221.       
  222. re模块:  
  223.     正则表达式模块函数:《python核心编程》P472  
  224. math,cmath模块:  
  225.     数学运算,复数运算函数  
  226. operator模块:  
  227.     一些数值操作函数集合。参考优快云收藏  
  228. copy模块:  
  229.     copy.copy(a)        复制对象  
  230.     copy.deepcopy(a)    复制集合  
  231.   
  232. fileinput 模块:  
  233.     处理文件内容模块  
  234. shutil 模块:  
  235.     包含一些复制文件和文件夹的函数:  
  236.           
<think>好的,我现在需要帮用户封装一个执行ADB push或pull文件的方法,并且在push完成后触发媒体扫描。首先,我需要明确用户的需求:形参包括local_path(本地路径)、remote_path(远程路径,即手机路径)、operation(决定是push还是pull)。push完成后还要执行媒体扫描的命令。 首先,我需要考虑如何用Python来封装这个方法,因为用户可能希望用脚本自动化操作。Python的subprocess模块可以用来执行命令行指令,所以应该用这个模块。 接下来,处理operation参数。需要判断operation是'push'还是'pull',然后执行对应的adb命令。push的话是adb push local_path remote_path,pull的话是adb pull remote_path local_path。需要注意命令的正确性,比如路径是否需要转义,但一般情况下直接拼接即可。 然后,push完成后需要触发媒体扫描。根据用户提供的命令,应该是adb shell am broadcast -a android.intent.action.MEDIA_SCANNER_SCAN_FILE -d file:///remote_path。这里要注意remote_path在手机上的路径是否正确,比如是否以/开头,是否需要转义空格或特殊字符。可能需要对remote_path进行处理,确保file:///后面的路径正确。 另外,需要考虑异常处理。比如执行adb命令时可能失败,这时候应该抛出错误或者返回错误信息。可以用subprocess.check_call来执行命令,如果命令返回非零状态码,会抛出CalledProcessError,这样用户可以捕获异常。 还需要考虑路径的拼接是否正确。比如,在push时,local_path是本地电脑的路径,remote_path是手机的路径,需要确保这两个路径在命令中正确传递。同样,pull时是从手机拉取到本地,所以参数顺序是remote_path在前,local_path在后。 然后,媒体扫描的部分,在push成功后执行。所以需要先执行push命令,如果成功,再执行扫描命令。如果push失败,就不执行扫描。 现在,开始编写函数的大纲: 函数名可能是adb_push_pull,参数是local_path, remote_path, operation。 首先检查operation是否是'push'或'pull',否则抛出 ValueError。 然后根据operation执行对应的adb命令。使用subprocess.check_call来执行,这样如果命令失败会抛出异常。 如果是push,且执行成功,那么执行媒体扫描的命令。扫描的命令是adb shell am broadcast -a android.intent.action.MEDIA_SCANNER_SCAN_FILE -d file:///{remote_path}。这里需要注意remote_path是否需要处理,比如如果remote_path是/sdcard/DCIM/image.jpg,那么file:///后面应该是sdcard/DCIM/image.jpg吗?或者是否需要三个斜杠?正确的应该是file:///加上手机的绝对路径,比如file:///sdcard/DCIM/image.jpg,所以拼接的时候应该是f"file:///{remote_path}"吗?不,原用户提供的命令是-d file:///+remote_path,可能用户示例中的remote_path是绝对路径,比如/sdcard/DCIM/图片.jpg,那么file:///后面应该接这个路径,所以正确的拼接是f"file://{remote_path}"?或者原命令中的示例是file:///sdcard/DCIM/图片.jpg,所以应该是file:///加上路径,即当remote_path是绝对路径时,file:///后面直接跟路径。比如remote_path是/sdcard/DCIM/图片.jpg,那么-d参数应该是file:///sdcard/DCIM/图片.jpg。所以正确的拼接应该是f"file://{remote_path}"吗?不,因为三个斜杠的话,file:///后面是路径,所以如果remote_path是绝对路径,比如以/开头,那么file://后面应该有三个斜杠,即file:///sdcard/...。所以正确的构造应该是f"file://{remote_path}",但需要确保remote_path是绝对路径。例如,如果remote_path是/sdcard/DCIM/image.jpg,那么file:///sdcard/DCIM/image.jpg是正确的,所以拼接时应该是f"file://{remote_path}"。或者可能用户示例中的命令是adb shell am broadcast -a ... -d file:///sdcard/...,所以这里的-d参数的值是file:///加上手机的绝对路径。因此,在Python中构造这个参数时,应该是f"file://{remote_path}",但需要注意remote_path是否以/开头。如果remote_path是绝对路径(如/sdcard/...),那么file:///后面直接是路径,所以正确的拼接是f"file://{remote_path}"。例如,remote_path是"/sdcard/DCIM/image.jpg",那么拼接后是"file:///sdcard/DCIM/image.jpg",对吗?是的,因为file://后面跟三个斜杠表示本地文件,所以正确的参数是file:///加上绝对路径。所以在代码中,应该将-d参数的值设置为f"file://{remote_path}"。 然后,执行扫描命令,同样使用subprocess.check_call。 另外,需要考虑adb是否在环境变量中,或者是否需要指定adb的路径。假设用户已经将adb添加到环境变量,所以直接使用adb命令即可。 现在,编写代码的大致结构: import subprocess def adb_push_pull(local_path, remote_path, operation): # 检查operation是否合法 if operation not in ('push', 'pull'): raise ValueError("operation must be 'push' or 'pull'") # 执行push或pull if operation == 'push': push_cmd = ['adb', 'push', local_path, remote_path] try: subprocess.check_call(push_cmd) print("Push成功") # 执行媒体扫描 scan_cmd = ['adb', 'shell', 'am', 'broadcast', '-a', 'android.intent.action.MEDIA_SCANNER_SCAN_FILE', '-d', f'file://{remote_path}'] subprocess.check_call(scan_cmd) print("媒体扫描完成") except subprocess.CalledProcessError as e: print(f"Push或扫描失败,错误码:{e.returncode}") raise else: # pull pull_cmd = ['adb', 'pull', remote_path, local_path] try: subprocess.check_call(pull_cmd) print("Pull成功") except subprocess.CalledProcessError as e: print(f"Pull失败,错误码:{e.returncode}") raise 这样应该可以实现基本功能。但需要注意以下几点: 1. 路径中的空格或特殊字符需要处理,比如用引号包裹,但subprocess传递列表参数时不需要,因为列表中的每个元素是独立的参数,不会被shell解析,所以如果路径有空格,local_path或remote_path应该作为一个元素传递,比如local_path如果是"C:/My Photos/image.jpg",在列表中是['adb', 'push', 'C:/My Photos/image.jpg', '/sdcard/DCIM'],这样subprocess会正确处理。 2. 媒体扫描的命令是否正确。例如,当remote_path是目录时,是否需要扫描整个目录?但用户需求是push文件后扫描该文件,所以应该是扫描单个文件,所以用MEDIA_SCANNER_SCAN_FILE广播是正确的。 3. 异常处理:如果push成功但扫描失败,应该如何处理?当前代码中会抛出异常,用户可以捕获处理。 4. 返回值:是否需要返回成功或失败的状态?当前代码通过print提示,但可以返回布尔值或者更详细的信息。 5. 手机是否连接:需要确保adb设备已连接,否则命令会失败。可能需要在函数中先检查设备连接状态,但用户可能希望自己处理这部分,所以可能不需要在函数内处理。 现在,用户可能需要这个函数能够处理常见的情况,比如路径中的空格,正确执行命令,并在push后扫描。所以最终的封装应该包括这些考虑。 </think>以下是一个使用Python封装的ADB文件传输方法,支持`push`(推送)和`pull`(拉取)操作,且在`push`完成后自动触发媒体扫描更新媒体库: ```python import subprocess def adb_file_operation(local_path: str, remote_path: str, operation: str) -> bool: """ 通过ADB执行文件推送(push)或拉取(pull)操作,push后自动扫描媒体库 :param local_path: 本地文件/目录路径(如:"C:/images/test.jpg") :param remote_path: 手机端文件/目录路径(如:"/sdcard/DCIM/test.jpg") :param operation: 操作类型("push"或"pull") :return: 操作是否成功(True/False) """ # 校验操作类型 if operation not in ("push", "pull"): raise ValueError("operation 必须为 'push' 或 'pull'") try: # 执行push或pull命令 if operation == "push": # 推送文件到手机 push_cmd = ["adb", "push", local_path, remote_path] subprocess.check_call(push_cmd, stdout=subprocess.DEVNULL, stderr=subprocess.STDOUT) # 推送成功后触发媒体扫描(仅文件需扫描,目录无需扫描) if "." in remote_path.split("/")[-1]: # 简单判断是否为文件(非目录) scan_cmd = [ "adb", "shell", "am", "broadcast", "-a", "android.intent.action.MEDIA_SCANNER_SCAN_FILE", "-d", f"file://{remote_path}" ] subprocess.check_call(scan_cmd, stdout=subprocess.DEVNULL, stderr=subprocess.STDOUT) print(f"已推送并扫描文件:{remote_path}") else: print(f"已推送目录到:{remote_path}(目录无需扫描)") else: # pull操作 pull_cmd = ["adb", "pull", remote_path, local_path] subprocess.check_call(pull_cmd, stdout=subprocess.DEVNULL, stderr=subprocess.STDOUT) print(f"已拉取文件到:{local_path}") return True except subprocess.CalledProcessError as e: print(f"{operation} 操作失败,错误信息:ADB命令执行失败(错误码:{e.returncode})") return False except Exception as e: print(f"{operation} 操作失败,异常信息:{str(e)}") return False # 示例使用 if __name__ == "__main__": # 推送本地图片到手机并扫描 adb_file_operation( local_path="C:/Users/Desktop/test.jpg", remote_path="/sdcard/DCIM/Camera/test.jpg", operation="push" ) # 从手机拉取文件到本地 adb_file_operation( local_path="D:/backup/", remote_path="/sdcard/Documents/report.pdf", operation="pull" ) ``` ### **关键说明** 1. **命令安全性**:使用`subprocess.check_call`执行ADB命令,若命令失败(如设备未连接、路径错误)会抛出`CalledProcessError`,并返回`False`。 2. **媒体扫描优化**:仅当`remote_path`是文件(通过简单判断是否含扩展名)时触发扫描,避免对目录重复扫描(目录扫描需用`MEDIA_MOUNTED`广播,需Root权限)。 3. **输出静默**:通过`stdout=subprocess.DEVNULL`隐藏ADB命令的冗余输出,仅保留关键提示。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值