A. linux下执行python官网的psutil模块的代码出错
TypeError: process_iter() got an unexpected keyword argument 'attrs'
翻译过来,就是你调用的这个函数process_iter()传入的参数错误,不应该有个attrs参数。
很明显,传入的关键字参数不对
要么你输入错了关键字参数的名字,要么就是你的linux中psutil版本不对
所谓的示例代码,要么就是最新的版本,要么就是很久没有人维护,更新之后接口大变的版本。
两个建议:
1、查看pstuil的源代码,找到具体的代码之后传参的方式就很明显了。
2、进入PythonIDE,import psutil后使用help(psutil.process_iter)查看本机上这个版本的接口文档
B. linux python运行报编码错误
一次重启服务器后,supervisor接管的python脚本中的函数 open() 和 print() 都会报下面的编码错误:
UnicodeEncodeError: 'ascii' codec can't encode
使用的是python3,按理说编码都会默认utf-8,而且本地运行的python脚本并没有这个问题。
经大佬指点,增加环境变量 export LC_ALL="en_US.UTF-8" 后,再重启supervisor,问题解决
下面是复制的: https://www.cnblogs.com/badboy200800/p/11215981.html
Locale是一个软件在运行时的语言环境,。是根据计算机用户所使用的语言,所在国家或者地区,以及当地的文化传统所定义的。它包括语言(Language), 地域 (Territory) 和字符集(Codeset)。
一个locale的书写格式为: 语言[ 地域[.字符集]]。完全的locale表达方式是 [语言[ 地域][.字符集] [@修正值]。例如:
zh_CN.GB2312 => 中文_中华人民共和国+国标2312字符集。
(1)locale把按照所涉及到的文化传统的各个方面分成12个大类
(2)查看标准字符集列表
常用字符集:en_US.utf8、zh_CN.gb2312、zh_CN.gbk、zh_CN.utf8等
3.Locale的设定
LC_ALL和LANG优先级的关系:LC_ALL > LC_* >LANG
(1)如果需要一个纯中文的系统的话,设定LC_ALL= zh_CN.XXXX即可。或者设定LANG=zh_CN.XXXX也可以,但是LC_ 不要有任何特殊设定才可以(因为LC_ 优先级高)。
(2)如果需要个性化的环境,例如只想要一个可以输入中文的环境,而保持菜单、标题,系统信息等等为英文界面,那么只需要设定LANG=en_US.XXXX,然后 LC_CTYPE=zh_CN.XXXX就可以了。
(3)假如什么也不做的话,也就是LC_ALL,LANG和LC_*均不指定特定值的话,系统将采用POSIX作为lcoale,也就是C locale。
4.查看与设定字符集实践
(1)查看当前系统字符集三种方式(LC_ALL、LC_CTYPE和LANG),以查看LANG为例:
(2)更改系统字符集
备注:直接执行上述命令,可以临时修改系统字符集。如果写入环境变量可以永久改变字符集。
(3)取消当前系统字符集(设定为空)
备注:直接执行上述命令,可以临时修改系统字符集。如果写入环境变量可以永久改变字符集。
C. LINUX下要在C中嵌入Python,编译的时候怎样解决库的连接问题
原因分析:
先看几个概念:
与外部库连接
外部库有两种:(1)静态连接库lib.a
(2)共享连接库lib.so
共同点:
.a, .so都是.o目标文件的集合,这些目标文件中含有一些函数的定义(机器码),而这些函数将在连接时会被最终的可执行文件用到。
区别:
静态库.a : 当程序与静态库连接时,库中目标文件所含的所有将被程序使用的函数的机器码被到最终的可执行文件中。
共享库.so : 与共享库连接的可执行文件只包含它需要的函数的表,而不是所有的函数代码,在程序执行之前,那些需要的函数代码被拷贝到内存中,这样就使可执行文件比较 小,节省磁盘空间(更进一步,操作系统使用虚拟内存,使得一份共享库驻留在内存中被多个程序使用)。共享库还有个优点:若库本身被更新,不需要重新编译与 它连接的源程序。
具体分析:
编译器会给出上述错误信息,这是因为sqrt函数不能与外部数学库"libm.a"相连。sqrt函数没有在程序中定义,也不存在于默认C库 "libc.a"中,应该显式地选择连接库。上述出错信息中的"/tmp/ccdzoSZq.o"是gcc创造的临时目标文件,用作连接时用。