目前我使用到的python中执行cmd的方式有三种html
该方法在调用完shell脚本后,返回一个16位的二进制数,低位为杀死所调用脚本的信号号码,高位为脚本的退出状态码,即脚本中“exit 1”的代码执行后,os.system函数返回值的高位数则是1,若是低位数是0的状况下,则函数的返回值是0×100,换算为10进制获得256。 若是咱们须要得到os.system的正确返回值,那使用位移运算能够还原返回值: >>> n = os.system(test.sh) >>> n >> 8 >>> 3 这是最简单的一种方法,特色是执行的时候程序会打出cmd在linux上执行的信息。使用前须要import os。 os.system("ls") 仅仅在一个子终端运行系统命令, 而不能获取命令执行后的返回信息
这种调用方式是经过管道的方式来实现,函数返回一个file-like的对象,里面的内容是脚本输出的内容(可简单理解为echo输出的内容)。使用os.popen调用test.sh的状况:python调用Shell脚本,有两种方法:os.system(cmd)或os.popen(cmd),前者返回值是脚本的退出状态码,后者的返回值是脚本执行过程当中的输出内容。实际使用时视需求状况而选择。明显地,像调用”ls”这样的shell命令,应该使用popen的方法来得到内容 popen(command [, mode='r' [, bufsize]]) -> pipe tmp = os.popen('ls *.py').readlines()
如今大部分人都喜欢使用Popen。Popen方法不会打印出cmd在linux上执行的信息。的确,Popen很是强大,支持多种参数和模式。使用前须要from subprocess import Popen, PIPE。可是Popen函数有一个缺陷,就是它是一个阻塞的方法。若是运行cmd时产生的内容很是多,函数很是容易阻塞住。解决办法是不使用wait()方法,可是也不能得到执行的返回值了。 Popen原型是: subprocess.Popen(args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=False, shell=false) 参数bufsize:指定缓冲。我到如今还不清楚这个参数的具体含义,望各个大牛指点。 参数executable用于指定可执行程序。通常状况下咱们经过args参数来设置所要运行的程序。若是将参数shell设为 True,executable将指定程序使用的shell。在windows平台下,默认的shell由COMSPEC环境变量来指定。 参数stdin, stdout, stderr分别表示程序的标准输入、输出、错误句柄。他们能够是PIPE,文件描述符或文件对象,也能够设置为None,表示从父进程继承。 参数preexec_fn只在Unix平台下有效,用于指定一个可执行对象(callable object),它将在子进程运行以前被调用。 参数Close_sfs:在windows平台下,若是close_fds被设置为True,则新建立的子进程将不会继承父进程的输入、输出、错误管 道。咱们不能将close_fds设置为True同时重定向子进程的标准输入、输出与错误(stdin, stdout, stderr)。 若是参数shell设为true,程序将经过shell来执行。 参数cwd用于设置子进程的当前目录。 参数env是字典类型,用于指定子进程的环境变量。若是env = None,子进程的环境变量将从父进程中继承。 参数Universal_newlines:不一样操做系统下,文本的换行符是不同的。如:windows下用’/r/n’表示换,而Linux下用 ‘/n’。若是将此参数设置为True,Python统一把这些换行符看成’/n’来处理。 参数startupinfo与createionflags只在windows下用效,它们将被传递给底层的CreateProcess()函数,用 于设置子进程的一些属性,如:主窗口的外观,进程的优先级等等。 subprocess.PIPE 在建立Popen对象时,subprocess.PIPE能够初始化stdin, stdout或stderr参数,表示与子进程通讯的标准流。 subprocess.STDOUT 建立Popen对象时,用于初始化stderr参数,表示将错误经过标准输出流输出。 Popen的方法: Popen.poll() 用于检查子进程是否已经结束。设置并返回returncode属性。 Popen.wait() 等待子进程结束。设置并返回returncode属性。 Popen.communicate(input=None) 与子进程进行交互。向stdin发送数据,或从stdout和stderr中读取数据。可选参数input指定发送到子进程的参数。 Communicate()返回一个元组:(stdoutdata, stderrdata)。注意:若是但愿经过进程的stdin向其发送数据,在建立Popen对象的时候,参数stdin必须被设置为PIPE。一样,如 果但愿从stdout和stderr获取数据,必须将stdout和stderr设置为PIPE。 Popen.send_signal(signal) 向子进程发送信号。 Popen.terminate() 中止(stop)子进程。在windows平台下,该方法将调用Windows API TerminateProcess()来结束子进程。 Popen.kill() 杀死子进程。 Popen.stdin 若是在建立Popen对象是,参数stdin被设置为PIPE,Popen.stdin将返回一个文件对象用于策子进程发送指令。不然返回None。 Popen.stdout 若是在建立Popen对象是,参数stdout被设置为PIPE,Popen.stdout将返回一个文件对象用于策子进程发送指令。不然返回 None。 Popen.stderr 若是在建立Popen对象是,参数stdout被设置为PIPE,Popen.stdout将返回一个文件对象用于策子进程发送指令。不然返回 None。 Popen.pid 获取子进程的进程ID。 Popen.returncode 获取进程的返回值。若是进程尚未结束,返回None。
p = Popen("cp -rf a/* b/", shell=True, stdout=PIPE, stderr=PIPE)
p.wait()
if p.returncode != 0:
print "Error."
return -1
这个方法也不会打印出cmd在linux上执行的信息。这个方法惟一的优势是,它不是一个阻塞的方法。即没有Popen函数阻塞的问题。使用前须要import commands。
status, output = commands.getstatusoutput("ls") 还有只得到output和status的方法: commands.getoutput("ls") commands.getstatus("ls")
ospython
模块类型 | c操做 | s说明 | b备注 |
---|---|---|---|
分隔符 | os.sep | 能够取代操做系统特定的路径分割符 | 文件夹分隔符,windows中是 \ |
os.extsepv | 扩展名分隔符,windows中是 . | ||
os.pathsep | 扩展名分隔符,windows中是 ; | ||
os.linesep | 字符串给出当前平台使用的行终止符。例如,Windows使用'\r\n',Linux使用'\n' 而Mac使用'\r'。 | 换行分隔符,windows中是 \r\n | |
得到基本信息 | os.name | 字符串指示你正在使用的平台。好比对于Windows,它是'nt',而对于Linux/Unix用户,它是'posix' | 系统名称('posix', 'nt', 'os2', 'mac', 'ce' or 'riscos') |
os.getcwd() | 函数获得当前工做目录, | ||
os.curdir | 返回当前目录('.') | ||
os.getenv()和os.putenv() | 函数分别用来读取和设置环境变量。 | ||
文件夹,路径操做 | os.walk(path) | 列举path下的全部文件、文件夹 | |
os.listdir(path) | 列出dirname下的目录和文件 | ||
os.makedir(path) | 建立文件夹 | 建立已存在的文件夹将异常 | |
os.makedirs(path) | 递归式的建立文件夹 | 建立已存在的文件夹将异常 | |
os.rmdir(path) | 删除一个文件夹 | 删除非空的文件夹将异常 | |
os.remove() | 函数用来删除一个文件。 | ||
os.removedirs(path) | 归的删除文件夹,直到有一级的文件夹非空 | 文件夹路径不能以'\'结束 | |
os.chdir(dirname) | 改变工做目 | 能够改路径,可是不能覆盖目标文件 | |
os.renames(src,dst) | 递归式的给文件或文件名更名 | ||
os.rename(src,dst) | 给文件或文件夹更名 | ||
os.chdir(dirname) | 改变工做目录到dirname | ||
时间 | getatime(path) | 文件或文件夹的最后访问时间,重新纪元到访问时的秒数 | |
getmtime(path) | 文件或文件夹的最后修改时间 | ||
getctime(path) | 文件或文件夹的建立时间 |
os.pathlinux
操做 | 说明 | 备注 |
---|---|---|
os.path.isfile()和os.path.isdir() | 函数分别检验给出的路径是一个文件仍是目录,返回bool值 | |
os.path.exists() | 函数用来检验给出的路径是否真地存在 返回bool | |
os.path.getsize(name) | 得到文件大小,若是name是目录返回0L 返回long 单位是字节 | |
os.path.abspath(name) | 得到绝对路径 | |
os.path.normpath(path) | 规范path字符串形式, 结果通常状况下把/变为// | |
os.path.split(name) | 将name分割成路径名和文件名,结果为(路径名,文件名.文件扩展名)(事实上,若是你彻底使用目录,它也会将最后一个目录做为文件名而分离,同时它不会判断文件或目录是否存在) | |
os.path.splitext(filename) | 分离文件名与扩展名 结果为(filename,扩展名) 若是参数为一个路径 则返回(路径,'') | |
os.path.join(path,name) | 链接目录与文件名或目录 结果为path/name | |
os.path.basename(path) | 返回文件名 实际为把path的最后一个"/"分割,返回后者。无论参数是一个路径仍是文件 与os.path.split(name)相同 不一样之处后者返回两个值得元组 | |
os.path.dirname(path) | 返回文件路径 实际为把path的最后一个"/"分割,返回前者。无论参数是一个路径仍是文件 | |
os.system() | 函数用来运行shell命令 |
os模块包装了不一样操做系统的通用接口,使用户在不一样操做系统下,可使用相同的函数接口,返回相同结构的结果。shell
操做 | 说明 | 备注 |
---|---|---|
execl(path) | 运行一个程序来替代当前进程,会阻塞式运行 | |
_exit(n) | 退出程序 | |
startfile(filename) | 用与文件关联的程序运行,关联程序打开后,当即返回 | |
system(cmd) | 运行一个程序或命令,会当即返回,并在cmd执行完成后,会返回cmd退出代码 | |
os.path | 在不一样的操做系统中调用不一样的模块,是一个可import的模块,这个模块中提供不少有用的操做 | |
abspath(path) | 回path的绝对路径,若path已是绝对路径了,则保持。 | |
basename(path) | 返回path中的文件名 | |
commonprefix(list) | 返回list中的统一前缀,用于得到一组字符串的左起相同的内容 | |
dirname(path) | 返回path中的文件夹部分,结果不包含'\' | |
exists(path) | 文件或文件夹是否存在 | |
getsize(path) | 文件或文件夹的大小,如果文件夹返回0 | |
isabs(path) | 返回是不是绝对路径 | |
isfile(path) | 返回是不是文件路径 | |
isdir(path) | 返回是不是文件夹路径 | |
islink(path)数据库 |
返回是不是快捷方式windows |
|
join(path1,path2,...) | 将path进行组合,若其中有绝对路径,则以前的path将被删除 | |
normcase(path) | 转换路径中的间隔符 | |
normpath(path) | 转换路径为系统可识别的路径 | |
realpath(path) | 转换路径为绝对路径 | |
split(path) | 将路径分解为(文件夹,文件名) | |
splitext(path) | 将路径分解为(其他部分,.扩展名),若文件名中没有扩展名,扩展名部分为空字符串 |
在操做与系统不支持的对象时,抛出OSError异常。浏览器
# -*- coding:utf-8 -*- ''' 删除media下的文件 ''' import os my_file_ROOT = 'C:/Users/xianmengxuanling/Desktop/star' my_file_media = 'media' del_Media = my_file_ROOT + '/' + my_file_media def DeleteMedia(del_Media): for i in os.listdir(del_Media): del_dir = None del_dirFile = os.path.join(del_Media,i) if os.path.isfile(del_dirFile): #若是是文件则删除 print(del_dirFile) os.remove(del_dirFile) else: #不是文件只能是目录,就遍历后再删除 del_dir = del_dirFile for j in os.listdir(del_dir): del_dir_files = os.path.join(del_dir, j) print(del_dir_files) os.remove(del_dir_files) DeleteMedia(del_Media) print ('删除完了上传的图片和文件!')
# -*- coding:utf-8 -*- ''' 在每一个APP的migrations文件夹下,保留__init__.py文件,删除其余文件 ''' import os import os.path my_file_ROOT = 'C:/Users/xianmengxuanling/Desktop/star' my_file_APP = ['file_db','files_db','img_db','imgs_db','pro_db','xadmin'] my_file_migartions = 'migrations' my_file_init = '__init__.py' undel_file_list = [r'\__init__.py',] def DeleteFiles(path,fileList): for parent,dirnames,filenames in os.walk(path): FullPathList = [] DestPathList = [] for x in fileList: DestPath = path + x DestPathList.append(DestPath) for filename in filenames: FullPath = os.path.join(parent,filename) FullPathList.append(FullPath) for xlist in FullPathList: if xlist not in DestPathList: os.remove(xlist) def DelFiles(): for i in my_file_APP: del_ROOT = my_file_ROOT + '/' + i + '/' + my_file_migartions DeleteFiles(del_ROOT, undel_file_list) DelFiles() print ('删除完了初始化的文件!')
# -*- coding:utf-8 -*- ''' 建立media下的几个空文件夹 ''' import os my_file_ROOT = 'C:/Users/xianmengxuanling/Desktop/starr' my_file_media = 'media' add_Media = my_file_ROOT + '/' + my_file_media my_file_media_dir = ['file','files','img','imgs','soft','pic_folder'] def mkdir(add_Media): for i in my_file_media_dir: add_dir = add_Media + '/' + i # print(add_dir,os.path.exists(add_dir)) if os.path.exists(add_dir)==False: # 判断是否存在文件夹若是不存在则建立为文件夹 os.makedirs(add_dir) # 建立文件时若是路径不存在会建立这个路径 print(add_dir+'建立好了') else: print ('没有这样的文件路径: %s ' % add_dir) mkdir(add_Media)
执行操做的文件结构app
--star函数
--file_dbui
--migrations
__init__.py
0001_initial.py
--files_db
...
--img_db
...
--imgs_db
...
--media
--file
xcsdfsdf.jpg
...
--files
...
--img
...
--imgs
...
--soft
...
--pic_folder
...
sdsadas.jpg
...
# -*- coding:utf-8 -*- ''' 打开管理员cmd面板 ''' import subprocess # 方式1:经过runas /savecred subprocess.Popen("runas /savecred /user:Administrator cmd", shell=True) # 方式2:经过pexpect方式 import codecs from pexpect import popen_spawn child=popen_spawn.PopenSpawn(r'runas /user:Administrator cmd')
# -*- coding:utf-8 -*- ''' 以管理员方式启动浏览器 ''' import os # os.system("runas /user:Administrator \"C:\Program Files\Internet Explorer\iexplore.exe\"")
启动窗口
若是有对是否启用空密码本组帐户的问题,请参照下面修改:
在运行框输入
gpedit.msc
python获取文件上一级目录:取文件所在目录的上一级目录
os.path.abspath(os.path.join(os.path.dirname('settings.py'),os.path.pardir))
os.path.pardir是父目录,os.path.abspath是绝对路径
举例具体看一下输出:
print os.path.dirname(os.path.abspath("__file__"))
print os.path.pardir
print os.path.join(os.path.dirname("__file__"),os.path.pardir)
print os.path.abspath(os.path.join(os.path.dirname("__file__"),os.path.pardir))
运用示例:
os.path.dirname(os.getcwd())#当前目录的上一级路径
问题缘由是系统显示不能为utf-8
两项修改成gbk便可
利用os.chdir(path)切换路径,执行多个命令
# -*-coding:utf-8-*- # Author:WYC import os # os.system('date')#设置为GBK便可解决乱码问题 my_file_ROOT = 'D:/star' operate0 = 'python manage.py migrate --fake-initial'#确保表创建的数量完整 operate1 = 'python manage.py makemigrations' operate2 = 'python manage.py migrate' #operate3 = 'manage.py createsuperuser'#执行有问题,还没找到解决方法 print(os.getcwd()) os.chdir(my_file_ROOT)#切换工做目录 print(os.getcwd()) os.system(operate0) os.system(operate1) os.system(operate2) #以上操做在数据库创建相应的空库后,能够连续执行初始化
容许以后,系统自己的cmd是不能关联的,因此用了cmder
就会跳出这个框框
还没解决,建立超管的操做,若有方法,请留言
1.python笔记之调用系统命令:https://www.zybuluo.com/bergus/note/232338
2.关于python调用cmd命令:https://www.cnblogs.com/lrw3716740/p/5158494.html
3.python os 命令,及判断文件夹是否存在:http://www.javashuo.com/article/p-admtiwzp-ch.html
4.解决:登陆失败,用户帐号限制。可能的缘由包括不容许空密码,登陆时间限制,或强制的策略限制:https://blog.csdn.net/xuhui_liu/article/details/73832743
5. Windows 下 Python 脚本以管理员方式执行 Windows 命令或者程序:https://testerhome.com/topics/11793