python 字符编码 调用其他程序 的一些问题记录

import sys

print len(sys.argv)
print type(sys.argv)
print str(sys.argv)
for a in range(1, len(sys.argv)):

        print sys.argv[a]



python调用shell命令的方法有许多 
1.1   os.system(command) 
       在一个子shell中运行command命令,并返回command命令执行完毕后的退出状态。这实际上是使用C标准库函数system()实现的。这个函数在执行command命令时需要重新打开一个终端,并且无法保存command命令的执行结果。 
1.2   os.popen(command,mode) 
      打开一个与command进程之间的管道。这个函数的返回值是一个文件对象,可以读或者写(由mode决定,mode默认是’r')。如果mode为’r',可以使用此函数的返回值调用read()来获取command命令的执行结果。 
1.3   commands.getstatusoutput(command) 
  使用os.popen()函数执行command命令并返回一个元组(status,output),分别表示command命令执行的返回状态和执行结果。对command的执行实际上是按照{command;} 2>&1的方式,所以output中包含控制台输出信息或者错误信息。output中不包含尾部的换行符。 

2.1   subprocess.call(["some_command","some_argument","another_argument_or_path"]) 
        subprocess.call(command,shell=True) 
2.2   subprocess.Popen(command, shell=True) 
       如果command不是一个可执行文件,shell=True不可省。 
       使用subprocess模块可以创建新的进程,可以与新建进程的输入/输出/错误管道连通,并可以获得新建进程执行的返回状态。使用subprocess模块的目的是替代os.system()、os.popen*()、commands.*等旧的函数或模块。 
  最简单的方法是使用class subprocess.Popen(command,shell=True)。Popen类有Popen.stdin,Popen.stdout,Popen.stderr三个有用的属性,可以实现与子进程的通信。 

将调用shell的结果赋值给python变量 
handle = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE) 
print handle.communicate()[0] 
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
在Python/wxPython环境下,执行外部命令或者说在Python程序中启动另一个程序的方法一般有这么几个: 
1、os.system(command) 
2、wx.Execute(command, syn=wx.EXEC_ASYNC, callback=None) 
     若置syn为wx.EXEC_ASYNC则wx.Excute函数立即返回,若syn=wx.EXEC_SYNC则等待调用的程序结束后再返回。 
     callback是一个wx.Process变量,如果callback不为None且syn=wx.EXEC_ASYNC,则程序结束后将调用wx.Process.OnTerminate()函数。 
os.system()和wx.Execute()都利用系统的shell,执行时会出现shell窗口。如在Windows下会弹出控制台窗口,不美观。下面的两种方法则没有这个缺点。 
3、class subprocess.Popen 
     最简单的用法是: 
     import subprocess 
     subprocess.Popen(command, shell=True) 
     如果command不是一个可执行文件,shell=True不可省。 
前面三个方法只能用于执行程序和打开文件,不能处理URL,打开URL地址可用webbrowser模块提供的功能。 
4、webbrowser.open(url) 
     调用系统缺省浏览器打开URL地址,如 webbrowser.open('http://www.google.com'),也可以利用 
     webbrowser.open('h:\python.zip')来执行程序。这样可以不必区分是文件名还是URL,不知道在Linux下是否可行。 
以上在Windows2000,Python2.4a1,wxPython 2.5.1运行。 
modify:还有一种方式:subprocess.call(*args, **kwargs) 



python string.decode  unicode.encode




os.system()是调用了C语言的标准函数system(),不过那个那个红红的limitations单词说明这个方法有其局限性。
最后一句话话说,subprocess模块更加强大,并建议我们尽量使用subprocess模块。


所以,应该尽量不要使用os.system()方法,而是用subprocess中的Popen对象或者call()方法代替,以免产生不可预知的错误。
python的官方网站上有人提交这个bug:http://bugs.python.org/issue1524,不过这个bug在07年就提交了,但看结果是wont fix(不会修复),看后面的评论,
原来是os.system()只是简单地把字符串传递给system()函数,自己并不会对字符串进行处理,所以这个bug应该是system()函数的问题或者windows shell的问题,
这确实不是python能修复的。


用r'"字符串"' 来避免路径空格

用os.popen()来执行,比os.system()以及subprocess.Popen() 或者subprocess.call()要好很多

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值