python编程中遇到的若干问题
问题1:项目需要,引入的Flash框架的server需要在独立的主进程执行,因此尝试用python调用外部程序的方式执行bat来启动,但程序总是一闪而过
代码示意看起来好像没什么问题,但和直接双击执行run.bat就是不一样,run.bat做了什么呢?
run.batrun.bat和webServer.py是在同级目录下的,双击bat执行完全没有问题,那么python调用bat后有是如何执行的呢?
python执行bat问题找到了,python调用bat时的执行空间是主程序所在的路径,因此虽然是按照绝对路径调用的bat,但bat的命令执行也被放到了python主程序的执行路径,当然找不到webServer.py了,服务器没启动成功,一闪而过。如何解决呢?bat做路径兼容。
路径兼容支持参数传递问题2:全局变量使用不合法UnboundLocalError: local variable 'packagename' referenced before assignment
如果定义了全局变量,后面在方法内只读取的话没有问题,但是如果你在方法内部对全局变量进行修改,那么就可能报上面的错误,为什么呢?
全局变量错误使用因为python是解释型语言,在方法内,一个变量的使用“print packagename”,会现在方法作用域内查找其定义,找到直接使用,未找到才会到全局搜索。而上面例子,我们在内部想给全局变量赋值“packagename = package_name”,这就让packagename变量变成了局部变量,那么第一条print语句就变成了想要谁出一个还未声明的局部变量了。修改方法很简单,在方法内声明变量为全局变量“global packagename”,然后再使用就可以了。
全局变量先声明再使用问题3:flask框架跨进程后发生了什么?
来源于一个工具项目,我们想要实时绘图展示Android设备上某apk的运行性能数据(CPU等),前期绘图组件调研人员选择了flash,图像也确实很漂亮,实现也简单,但在笔者接着想将flash与工具项目结合的时候遇到了若干跨进程后的无解问题。
第一个问题:flask server只能运行在自己的独立主进程中。当我们想要将其合并到工具内实例化并启动时,报错如上错误。因此无奈只能让工具调用.bat来启动server。
第二个问题:flask的绘图客户端要依赖完整的浏览器能力。我们之初想要用QtWebKit.QWebView()在工具内部展示绘图客户端(web),结果发现一片空白,而尝试加载其他网页(如qq.com)没有问题。二者的区别,flask的本地127.0.0.1代理的,并未找到根本原因,因此还是调用了PC本地浏览器来展示。
第三个问题:flask server使用os.popen执行adb命令时的返回结果为空。同样的调用方式,我们在工具内调用os.popen的执行结果完全正确,即使我们另起一个线程调用也没问题。但一旦使用flask server调用就不行,百般调试也未果,搞不懂管道的数据哪去了,因此忍痛放弃了flask框架,准备回归matlib框架。
若有flask大牛,期望能够指点下如上使用问题。
问题4:urllib.urlencode()带来的编码问题
问题代码如上代码,encode后的数据如下:
values=%7B%27p_id%27%3A+%27168%27%2C+%27uin%27%3A+%27%27%2C+%27version%27%3A+%27%27%2C+%27device%27%3A+%27%27%2C+%27time_range%27%3A+%272018%2F04%2F02+-+2018%2F04%2F02%27%2C+%27os%27%3A+%27%27%7D
如果再decode回来:
values={'p_id': '168', 'uin': '', 'version': '', 'device': '', 'time_range': '2018/04/02 - 2018/04/02', 'os': ''}
你会发现每个value的前面默认加了一个空格,而这个空格encode后是‘+’,这个‘+’导致后台策略拒绝服务,那么这里why?
而且如果想保留双引号都不行,会被默认变成单引号。网络检索仅有人提及urllib库无法正确处理嵌套结构的encode,并说明需要自己处理,但给出的解决方案比较片面,因此笔者自己针对自己的需求做了后置处理:
urlencode后置处理+%27 : +'
%22 : "
这里还替换了'null',是因为server需要的uin等默认字段是null且不带引号。
以上处理问题解决。
问题5:尝试安装chaco组件时报 command 'swig.exe' failed: No such file or directory
网搜有swig的安装http://www.swig.org/Doc1.3/Windows.html#Windows_installation
到swig官网下载最新的for windows的zip包,解压到某个目录下,并在环境变量中添加对应路径即可解决问题。
http://www.swig.org/download.html (官网下载地址)
swig-windows版包含swig.exe接下来你可能会遇到第二个错误:error: Unable to find vcvarsall.bat
解决该问题过程中,有人说是python和本地的vc编译环境版本不对应,具体的映射关系如下:
python与vc版本对应查询本地python需要版本:
1500对应vc2008不幸的是本地是安装有vc2008的:
vc开发环境另一篇文章讲解到是 64位和32位版本的问题:http://wangye.org/blog/archives/738/,但不幸的本地是vc2015,在疑似的命令行模式下运行对应的命令,编译时报了更多的错误。
问题6:从svn等开源平台下载的python源码,运行遇到‘No Module named xx.xxx’
目录结构是这样的:
root
--script
----main.py
--lib
----a.py
在main.py中我们import了lib.a,但是运行时会提示找不到lib.a。很明显的一个执行环境的问题。那么如何简单解决?
解决一:命令行运行时,在root目录执行即可:root>python ./script/main.py xxxx
解决二:eclipse修改Run Configurations
Run Configurations指定工作目录到root目录即可,然后点击 run 就可以正常运行了。
问题7:re.match总是NoneType
看起来明明可以匹配,可总是返回NoneType
正则在线测试是对的 网络获取的字段是unicode的 转utf8后 转不转utf8都是NoneType换用re.search就可以了,很奇怪,时间原因,暂不探究。留一个疑问在这里~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
问题8:ImportError: Install xlrd >= 1.0.0 for Excel support
该问题发生在pandas使用中,提示xlrd版本低,请升级。但在执行升级命令时又提示无法安装。
最简单的解决方案:到python/Lib/site-packages下xlrd的目录和xlrd-0.9.4-py2.7.egg-info文件删除,然后重新安装即可。
问题9:读取配置文件xxx.ini遇到报错ConfigParser.InterpolationSyntaxError:
'%' must be followed by '%' or '(', found: "%&'"
原因是配置文件中包含了%,把读取方式从cf= configparser.ConfigParser()换成cf = configparser.RawConfigParser()即可解决