php system ls 可以 python 失败,python中调用命令行命令

Python经常被称作“胶水语言”,因为它能够轻易地操作其他程序,轻易地包装使用其他语言编写的库。在Python/wxPython环境下,执行外部命令或者说在Python程序中启动另一个程序的方法。

1、os.system(command)

os.system()函数用来运行shell命令。此命令可以方便的调用或执行其他脚本和命令

#打开指定的文件

>>>os.system('notepad *.txt')

这个调用相当直接,且是同步进行的,程序需要阻塞并等待返回。返回值是依赖于系统的,直接返回系统的调用返回值,所以windows和linux是不一样的。

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、import subprocess

subprocess.Popen(args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=False, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0)

subprocess.call(["cmd", "arg1", "arg2"],shell=True)

Note:

1. 参数args可以是字符串或者序列类型(如:list,元组),用于指定进程的可执行文件及其参数。

2. 如果command(args)不是一个可执行文件,shell=True不可省。否则如copy\del命令可能会出现FileNotFoundError错误。

3. Popen.wait()可以得到命令的返回值

4. 如果是windows下的命令,则文件路径如果用的是linux格式会报错:The syntax of the command is incorrect.

举个栗子

ifsubprocess.Popen('dir /b %s'%filename, shell=True).wait() ==0 如果filename字符串中有空格,则会出现错误:File Not Found错误

可以通过下面["cmd","arg1","arg2"]两种方式

ifsubprocess.Popen(["dir", "/b", filename], shell=True).wait() ==0

ifsubprocess.call(["dir", "/b", filename], shell=True) ==0

4、webbrowser.open(url)

前面三个方法只能用于执行程序和打开文件,不能处理URL,打开URL地址可用webbrowser模块提供的功能。

调用系统缺省浏览器打开URL地址,如 webbrowser.open('http://www.jb51.net'),也可以利用

webbrowser.open('h:\python.zip')来执行程序。这样可以不必区分是文件名还是URL,不知道在Linux下是否可行。

以上在Windows2000,Python2.4a1,wxPython 2.5.1运行。

[python调用shell的方法]

5. os.popen(command[,mode[,bufsize]])

举个栗子

>>> import os >>> p = os.popen("dir c:", 'r') >>> p.read() bla bla... >>> p.close() >>> p = os.popen("dir d:", 'r') # 电脑中没有D盘 >>> p.read() '' >>> p.close() 1 >>>

可以看出,popen方法通过p.read()获取终端输出,而且popen需要关闭close().当执行成功时,close()不返回任何值,失败时,close()返回系统返回值. 可见它获取返回值的方式和os.system不同。

6. 使用commands模块

举个栗子

>>> import commands >>> commands.getstatusoutput('ls /bin/ls') (0, '/bin/ls') >>> commands.getstatusoutput('cat /bin/junk') (256, 'cat: /bin/junk: No such file or directory') >>> commands.getstatusoutput('/bin/junk') (256, 'sh: /bin/junk: not found') >>> commands.getoutput('ls /bin/ls') '/bin/ls' >>> commands.getstatus('/bin/ls') '-rwxr-xr-x 1 root 13352 Oct 14 1994 /bin/ls'

根据你需要的不同,commands模块有三个方法可供选择。getstatusoutput, getoutput, getstatus。

7. Python文档中目前全力推荐第四个方法,subprocess!

subprocess使用起来同样简单:

>>> subprocess.call(["ls", "-l"],shell=True) 0 >>> subprocess.call("ls -l", shell=True) 0 >>> subprocess.call("exit 1", shell=True) 1

直接调用命令,返回值即是系统返回。shell=True表示命令最终在shell中运行。Python文档中出于安全考虑,不建议使用shell=True。建议使用Python库来代替shell命令,或使用pipe的一些功能做一些转义。:

一个例子

1. 启动virtualenv是一个shell命令,要在shell中执行。否则出错:WindowsError: [Error 193] %1 is not a valid Win32 application

2.  然而virtualenv中执行的命令并不是shell命令,不是在shell中执行的,直接运行即可。否则出错:'scrapy' is not recognized as an internal or external command,operable program or batch file.

subprocess.call(r'..\Scripts\activate', shell=True)

subprocess.call('scrapy crawl dmoz')

如果你更关注命令的终端输出,可以这样

>>> subprocess.check_output(["echo", "Hello World!"]) 'Hello World!\n'

>>> subprocess.check_output("exit 1", shell=True)

Traceback (most recent call last): ... subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1

8. 还有两种方法:os.spawn* 和 popen2.*。它们也可以完成同样的任务

9. sh : Python subprocess interface

lz发现了一个相当不错的库amoffat/sh

这个库已经被津津乐道很久了。看代码:

from sh import git

git.clone("https://github.com/amoffat/sh")

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值