os模块
os.name
os.getenv(varname[, value])
os.environ --os.environ["PATH"]= mydir + ";" + os.environ["PATH"]
os.getcwd()
os.listdir(path)
os.chdir(path) :用os.system(cd /tmp)下一条命令会失效
os.geteuid()
os操作文件:
os.remove(path)
os.removedirs(path)
os.rename(src, dst)
>>> import os
>>> try:
... os.rmdir('/User/XXX')
... except OSError:
... print 'aaa'
...
aaa
os.path 路径
>>> os.path.split('/home/fangyali/test')
('/home/fangyali', 'test')
>>> os.path.dirname('/tmp')
'/'
>>> os.path.dirname('/home/fangyali/test')
'/home/fangyali'
>>> os.path.basename('/home/fangyali/test')
'test'
>>> os.path.exists('/home/fangyali/test')
True
>>> os.path.getsize('/home/fangyali/3306.sql')
761153441
>>> os.path.isfile('/home/fangyali/3306.sql')
True
>>> os.path.isdir('/home/fangyali/3306.sql')
False
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
ROOT_DIR = os.path.dirname(BASE_DIR)
TEMP_DIR = os.path.join(BASE_DIR, "templates")
import subprocess
p=subprocess.Popen("df -h", shell=True,stdin=subprocess.PIPE, stdout=subprocess.PIPE,stderr=subprocess.PIPE)
(stdout,errout) = p.communicate() #p.wait 可能死锁
print stdout #取结果
for i in p.stdout.readlines():
print i.split() #取结果
import subprocess
p=subprocess.Popen("ls -l", shell=True,stdin=subprocess.PIPE, stdout=subprocess.PIPE,stderr=subprocess.PIPE)
(stdout,errout) = p.communicate('/home/fangyali')
print stdout
p=subprocess.Popen("dir", shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
while True:
buff = p.stdout.readline()
if buff == '' and p.poll() != None:
break
详解:
Popen对象有以下方法:
Popen.poll()
检查子进程是否已结束,设置并返回returncode属性。
>>> p.poll()
0
Popen.wait()
等待子进程结束,设置并返回returncode属性。
>>> p.wait()
0
注意: 如果子进程输出了大量数据到stdout或者stderr的管道,并达到了系统pipe的缓存大小的话,
子进程会等待父进程读取管道,而父进程此时正wait着的话,将会产生传说中的死锁,后果是非常严重滴。建议使用communicate() 来避免这种情况的发生。
Popen.communicate(input=None)
和子进程交互:发送数据到stdin,并从stdout和stderr读数据,直到收到EOF。等待子进程结束。可选的input如有有的话,要为字符串类型。
此函数返回一个元组: (stdoutdata , stderrdata ) 。
注意,要给子进程的stdin发送数据,则Popen的时候,stdin要为PIPE;同理,要可以接收数据的话,stdout或者stderr也要为PIPE。
p1=subprocess.Popen('cat /etc/passwd',shell=True,stdin=subprocess.PIPE,stdout=subprocess.PIPE)
p2=subprocess.Popen('grep 0:0',shell=True,stdin=p1.stdout,stdout=subprocess.PIPE)
注意:读到的数据会被缓存在内存里,所以数据量非常大的时候要小心了。
>>> p.communicate()
(b'Filesystem Size Used Avail Capacity Mounted on\n/dev/ad0s1a 713M 313M 343M 48% /\ndevfs 1.0K 1.0K 0B 100% /dev\n/dev/ad0s1e 514M 2.1M 471M 0% /tmp\n/dev/ad0s1f 4.3G 2.5G 1.4G 64% /usr\n/dev/ad0s1d 2.0G 121M 1.7G 6% /var\n', None)
Popen.send_signal(signal)
给子进程发送signal信号。
注意:windows下目前只支持发送SIGTERM,等效于下面的terminate() 。
Popen.terminate()
停止子进程。Posix下是发送SIGTERM信号。windows下是调用TerminateProcess()这个API。
Popen.kill()
杀死子进程。Posix下是发送SIGKILL信号。windows下和terminate() 无异。
Popen.stdin
如果stdin 参数是PIPE,此属性就是一个文件对象,否则为None 。
Popen.stdout
如果stdout参数是PIPE,此属性就是一个文件对象,否则为None 。
Popen.stderr
如果stderr 参数是PIPE,此属性就是一个文件对象,否则为None 。
Popen.pid
子进程的进程号。注意,如果shell 参数为True,这属性指的是子shell的进程号。
>>> p.pid
22303
Popen.returncode
子程序的返回值,由poll()或者wait()设置,间接地也由communicate()设置。
如果为None,表示子进程还没终止。
如果为负数-N的话,表示子进程被N号信号终止。(仅限*nux)
用subprocess来代替其他函数
都可以用subprocess来完成,我们假定是用 “from subprocess import *” 来导入模块的:
代替shell命令:
p=`ls -l`
等效于
p=Popen(['ls','-l'],stdout=PIPE).communicate()[0]
代替shell管道:
p=`dmesg | grep cpu`
等效于
p1=Popen(['dmesg'],stdout=PIPE)
p2=Popen(['grep','cpu'],stdin=p1.stdout,stdout=PIPE)
output = p2.communicate()[0]
output
cpu0: <ACPI CPU> on acpi0\nacpi_throttle0: <ACPI CPU Throttling> on cpu0\n
>>> p1=subprocess.Popen('cat /etc/passwd',shell=True,stdout=subprocess.PIPE)
>>> p2=subprocess.Popen('grep 0:0',shell=True,stdin=p1.stdout,stdout=subprocess.PIPE)
>>> p3=subprocess.Popen("cut -d ':' -f 7",shell=True,stdin=p2.stdout,stdout=subprocess.PIPE)
>>> print p3.stdout.read()
代替os.system()
lsl = os.system('ls '+'-l')
这个是一个返回状态
等效于
p=Popen('ls -l', shell=True)
lsl=os.waitpid(p.pid,0)[1]
注意:
通常并不需要用shell来调用程序。用subprocess可以更方便地得到子程序的返回值。
其实,更真实的替换是:
try:
retcode = call(“mycmd” + ” myarg”, shell=True)
if retcode < 0:
print >>sys.stderr, “Child was terminated by signal”, -retcode
else:
print >>sys.stderr, “Child returned”, retcode
except OSError, e:
print >>sys.stderr, “Execution failed:”, e