python 解决Windows平台上路径有空格的问题


Posted in Python onNovember 10, 2020

最近在采集windows上中间件的时候,遇到了文件路径有空格的问题。

例如:Aapche的安装路径为D:\Program Files\Apache Software Foundation\Apache2.2。

采集apache要读取配置文件D:\Program Files\Apache Software Foundation\Apache2.2\conf\httpd.conf

执行一些D:\Program Files\Apache Software Foundation\Apache2.2\bin\httpd.exe -v 这种命令。

读取配置文件是没有问题的,因为用的是python代码,打开文件,读取文件,一行一行遍历,用正则匹配或者字符串比较,就能获取到信息,例如读取配置信息获取端口号。

port_list=[] 
   with open(httpd_conf, "r") as f:
    file_list = f.readlines()
    regex = ur"^Listen\s*(\S*?:)*(\d+)\s*$"
    pattern_listener = re.compile(regex)
    for item in file_list:
     listener_list = pattern_listener.findall(item)
     if listener_list:
      for port_info in listener_list:
       if port_info:
        port = port_info[1]
        if port and port.strip():
         port_list.append(port.strip())

接下来说下,D:\Program Files\Apache Software Foundation\Apache2.2\bin\httpd.exe -v 这种通过命令获取信息的。

httpd.exe -v 是获取apache的版本信息。直接在在cmd命令行中输入,显示如下。 

D:\>D:\Program Files\Apache Software Foundation\Apache2.2\bin\httpd.exe -v

'D:\Program' 不是内部或外部命令,也不是可运行的程序或批处理文件。

有空格问题,搜了搜发现比较好的一种解决办法,就是在把命令用双引号引起来,下边两种写法都可以。

D:\>"D:\Program Files\Apache Software Foundation\Apache2.2\bin\httpd.exe" -v
Server version: Apache/2.2.22 (Win32)
Server built: Jan 28 2012 11:16:39

D:\>"D:\Program Files\Apache Software Foundation\Apache2.2\bin\httpd.exe" "-v"
Server version: Apache/2.2.22 (Win32)
Server built: Jan 28 2012 11:16:39

接下来我们在python中用os.popen().read()试试怎么弄。

>>> import os
>>> cmd='"D:\Program Files\Apache Software Foundation\Apache2.2\bin\httpd.exe" -v'
>>> os.popen(cmd).read()--这种写法读出来结果为空,是因为\要经过转义,前边加个r就行,cmd与cmd1区别
''
>>> cmd





--\b是正则表达式,所以变成了\x08
'"D:\\Program Files\\Apache Software Foundation\\Apache2.2\x08in\\httpd.exe" -v'
>>> cmd1=r'"D:\Program Files\Apache Software Foundation\Apache2.2\bin\httpd.exe" -v'
>>> cmd1
'"D:\\Program Files\\Apache Software Foundation\\Apache2.2\\bin\\httpd.exe" -v'

>>> os.popen(cmd1).read()
'Server version: Apache/2.2.22 (Win32)\nServer built: Jan 28 2012 11:16:39\n'
>>>

接下来再看一个比较复杂点的命令,httpd.exe" -V|find "Server MPM" 这个用来获取apache的运行模式,windows下就是

WinNT,按刚才的套路在cmd命令行里执行没问题。

D:\>"D:\Program Files\Apache Software Foundation\Apache2.2\bin\httpd.exe" -V|find "Server MPM" Server MPM: WinNT

那么,我们继续把他移植到python中,继续用os.popen().read()。结果如下图,都不出来结果。

所以说,这种参数比较多的用这种方法是不行的。

>>> cmd1=r'"D:\Program Files\Apache Software Foundation\Apache2.2\bin\httpd.exe" -V|find "Server MPM" '
>>> os.popen(cmd1).read()
''

>>> cmd2=r'"D:\Program Files\Apache Software Foundation\Apache2.2\bin\httpd.exe" -V|find Server MPM '
>>> os.popen(cmd1).read()
''

>>> cmd3=r'"D:\Program Files\Apache Software Foundation\Apache2.2\bin\httpd.exe" "-V|find Server MPM" '
>>> os.popen(cmd1).read()
''

在查阅相关资料后,可用subprocess.Popen()来代替os.popen()这个方法,

但是执行后,出来的结果不是想要的,所以说这个方法也实现不了效果(如下)。

>>> import subprocess
>>> cmd=r'D:\Program Files\Apache Software Foundation\Apache2.2\bin\httpd.exe -V|find "Server MPM"'
>>> cmd
'D:\\Program Files\\Apache Software Foundation\\Apache2.2\\bin\\httpd.exe -V|find "Server MPM"'
>>> ps = subprocess.Popen(cmd)
>>> Server version: Apache/2.2.22 (Win32)
Server built: Jan 28 2012 11:16:39
Server's Module Magic Number: 20051115:30
Server loaded: APR 1.4.5, APR-Util 1.4.1
Compiled using: APR 1.4.5, APR-Util 1.4.1
Architecture: 32-bit
Server MPM:  WinNT
 threaded:  yes (fixed thread count)
 forked:  no

看到这样的结果,放弃折腾了,最终选择了一个曲线救国的方案,用python的os模块,先进入到httpd.exe所在的目录,之后,再执行命令。

>>> homepath="D:\Program Files\Apache Software Foundation\Apache2.2"
>>> BinPath = os.path.join(homepath, 'bin')
>>> os.chdir(BinPath)
>>> apache_model = os.popen('httpd.exe -V |find "Server MPM"').read()
>>> print apache_model
Server MPM:  WinNT

补充知识:python windows下获取路径时有中文处理

在windows中用os,path.abspath(__file__)时有中文路径时,默认是转成非unicode格式

这会导致,在其它模块使用该路径时,会报

utf8' codec can't decode byte 0xb7 in position 14: invalid start byte

怎么处理呢?

网上百度了一把,解决方法都不妥当,还是来个非通用的吧,但很好使用:

如下

project_path = os.path.abspath(__file__.decode('gbk'))

用该方法简单便捷。

好啦,以上这篇python 解决Windows平台上路径有空格的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python getopt详解及简单实例
Dec 30 Python
使用python实现生成用户信息
Mar 20 Python
Python错误: SyntaxError: Non-ASCII character解决办法
Jun 08 Python
Django中的Model操作表的实现
Jul 24 Python
python中强大的format函数实例详解
Dec 05 Python
关于python多重赋值的小问题
Apr 17 Python
python PyQt5/Pyside2 按钮右击菜单实例代码
Aug 17 Python
详解Python中pyautogui库的最全使用方法
Apr 01 Python
Python 操作SQLite数据库的示例
Oct 16 Python
Django Model层F,Q对象和聚合函数原理解析
Nov 12 Python
python 动态渲染 mysql 配置文件的示例
Nov 20 Python
Python解析微信dat文件的方法
Nov 30 Python
Python在后台自动解压各种压缩文件的实现方法
Nov 10 #Python
Python高阶函数与装饰器函数的深入讲解
Nov 10 #Python
pytorch学习教程之自定义数据集
Nov 10 #Python
pytorch加载语音类自定义数据集的方法教程
Nov 10 #Python
sublime3之内网安装python插件Anaconda的流程
Nov 10 #Python
python+excel接口自动化获取token并作为请求参数进行传参操作
Nov 10 #Python
python request 模块详细介绍
Nov 10 #Python
You might like
PHP4之COOKIE支持详解
2006/10/09 PHP
PHP的加密方式及原理
2012/06/14 PHP
PHP 万年历实现代码
2012/10/18 PHP
php版本的cron定时任务执行器使用实例
2014/08/19 PHP
PHP内核学习教程之php opcode内核实现
2016/01/27 PHP
PHP发送AT指令实例代码
2016/05/26 PHP
PHP更安全的密码加密机制Bcrypt详解
2017/06/18 PHP
25个好玩的JavaScript小游戏分享
2011/04/22 Javascript
jquery验证手机号码、邮箱格式是否正确示例代码
2013/07/28 Javascript
js this函数调用无需再次抓获id,name或标签名
2014/03/03 Javascript
jquery移动节点实例
2015/01/14 Javascript
使用Raygun对Node.js应用进行错误处理的方法
2015/06/23 Javascript
js实现获取当前时间是本月第几周的方法
2015/08/11 Javascript
VueJS组件之间通过props交互及验证的方式
2017/09/04 Javascript
bootstrap table实现双击可编辑、添加、删除行功能
2017/09/27 Javascript
vuex state及mapState的基础用法详解
2018/04/19 Javascript
微信小程序实现左右列表联动
2020/05/19 Javascript
vue draggable resizable gorkys与v-chart使用与总结
2019/09/05 Javascript
[53:21]2014 DOTA2国际邀请赛中国区预选赛5.21 DT VS LGD-CDEC
2014/05/22 DOTA
[01:20]DOTA2上海特级锦标赛现场采访:谁的ID最受青睐
2016/03/25 DOTA
Python随手笔记第一篇(2)之初识列表和元组
2016/01/23 Python
python虚拟环境的安装配置图文教程
2017/10/20 Python
python迭代dict的key和value的方法
2018/07/06 Python
用Python爬取QQ音乐评论并制成词云图的实例
2019/08/24 Python
python Django框架实现web端分页呈现数据
2019/10/31 Python
wxpython实现按钮切换界面的方法
2019/11/19 Python
python数据分析:关键字提取方式
2020/02/24 Python
python绘制汉诺塔
2021/03/01 Python
CSS3实现div从下往上滑入滑出效果示例
2020/04/28 HTML / CSS
C语言50道问题
2014/10/23 面试题
行政经理的岗位职责
2013/11/23 职场文书
打造高效课堂实施方案
2014/03/22 职场文书
机关出纳岗位职责
2014/04/03 职场文书
小学数学课后反思
2014/04/23 职场文书
2019企业给员工的慰问信
2019/06/24 职场文书
Pycharm 如何设置HTML文件自动补全代码或标签
2021/05/21 Python