首页
友链
关于
留言板
推荐
电脑壁纸
在线音乐
解压游戏
Search
1
【菜谱】咖喱鸡肉盖饭
3,704 阅读
2
pycharm生成requirements.txt
1,103 阅读
3
ubuntu安装docker和docker-compose
1,018 阅读
4
celery worker启动报错:AttributeError: 'str' object has no attribute 'items'
739 阅读
5
django后台管理界面美化
638 阅读
学习
python
linux
java
菜谱
随笔
登录
Search
标签搜索
笔记
linux
python
java
实用教程
原创
编程
多线程
docker
tomcat
thread
锁
线程同步
ssm
maven
Markdown
Windows
菜谱
生活笔记
django
Dawn
累计撰写
39
篇文章
累计收到
8
条评论
首页
栏目
学习
python
linux
java
菜谱
随笔
页面
友链
关于
留言板
推荐
电脑壁纸
在线音乐
解压游戏
搜索到
7
篇与
python
的结果
2021-02-02
pyinstaller打包成无控制台可执行文件与popen冲突的解决办法
原因popen会打开一个管道执行命令,而管道是有输入(stdin)、输出(stdout)的,但当我们使用pyinstaller打包可执行文件时使用了-w参数或者是.spec文件中console=False,python解释器是不带控制台的,所以它没有办法处理输入(stdin)包括使用python的input()函数都不行os.popen实际上是一个简单的封装,原型是subprocess.popensubprocess.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官方文档:https://docs.python.org/2/library/subprocess.html懒得看解释可以直接跳过下面这段,直接看解决方法args 是一个字符串(如cmd命令),或者是包含程序参数的列表。要执行的程序一般就是这个列表的第一项,或者是字符串本身。但是也可以用executable参数来明确指出。当executable参数不为空时,args里的第一项被认为是“命令名”,不同于真正的可执行文件的文件名,这个“命令名”是一个用来显示的名称,例如执行unix/linux下的 ps 命令,显示出来的就是这个“命令名”。bufsize 作用就跟python函数open()的buffering参数一样:0表示不缓冲,1表示行缓冲,其他正数表示近似的缓冲区字节数,负数表示使用系统默认值。默认是0。executable 参数指定要执行的程序。它很少会被用到,一般程序可以由args参数指定。如果shell参数为True,executable可以用于指定用哪个shell来执行(比如bash、csh、zsh等)。windows下,只有当你要执行的命令是shell内建命令(比如dir,copy等) 时,你才需要指定shell=True,而当你要执行一个基于命令行的批处理脚本(bat啥的)的时候,不需要指定此项。stdin、stdout和stderr分别表示子程序的标准输入、标准输出和标准错误。 可选的值有PIPE或者一个有效的文件描述符(其实是个正整数)或者一个文件对象,还有None。如果是PIPE,则表示需要创建一个新的管道,如果是 None,不会做任何重定向工作,子进程的文件描述符会继承父进程的。另外,stderr的值还可以是STDOUT,表示子进程的标准错误也输出到标准输出。如果把preexec_fn设置为一个可调用的对象(比如函数),就会在子进程被执行前被调用。(仅限unix/linux)如果把close_fds设置成True,unix/linux下会在开子进程前把除了0、1、2以外的文件描述符都先关闭。在 Windows下也不会继承其他文件描述符。如果把shell设置成True,指定的命令会在shell里解释执行,这个前面已经说得比较详细了。如果cwd(工作目录)不是None,则会把cwd做为子程序的当前目录。注意,并不会把该目录做为可执行文件的搜索目录,所以不要把程序文件所在目录设置为cwd。如果env不是None,则子程序的环境变量由env的值来设置,而不是默认那样继承父进程的环境变量。注意,即使你只在env里定义了某一个环境变量的值,也会阻止子程序得到其他的父进程的环境变量(也就是说,如果env里只有1项,那么子进程的环境变量就 只有1个了)。如果把universal_newlines设置成True,则子进程的stdout和stderr被视为文本对象,并且不管是unix/linux的换行符('n'),还是老mac格式的换行符('r'),还是windows 格式的换行符('rn')都将被视为'n' 。如果指定了startupinfo和creationflags,它们将会被传递给后面的CreateProcess()函数,用于指定子程序的各种其他属性,比如主窗口样式或者是子进程的优先级等。(仅限Windows)再解释一下两个我们后面要用到的东西:subprocess.PIPE一个可以用于Popen的stdin、stdout或stderr参数的特殊值,它指示应打开到标准流的管道。subprocess.STDOUT一个可以被用于Popen的stderr参数的特殊值,表示子程序的标准错误与标准输出汇合到同一句柄。解决办法首先问题根源:用pyinstaller的-w参数打包导致python无法处理输入值(stdin)os.popen 打开的管道却需要处理输入值(stdin)所以,我们不使用os.popen这个简单的封装,改成使用subprocess.popen,接着将subprocess.popen打开管道的输入值(stdin)重定向,即可解决问题!实例:p = subprocess.Popen( 'cmd命令', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, stdin=subprocess.PIPE, # 重定向输入值 creationflags=0x08000000 # 不弹窗 ) result = p.stdout.read().decode('gbk') # 读取cmd执行的输出结果
2021年02月02日
342 阅读
0 评论
0 点赞
2021-01-05
range和xrange的区别
首先声明:xrange在python3中已经木得了range在python2中range可以直接返回一个列表list = range(0, 4) # 可以直接得到list = [0, 1, 2, 3] type(list) # <type 'list'>而在python3中则完全不同list = range(0, 4) # 得到list = range(0, 4) type(list) # <class 'range'>xrange返回的是一个生成器,不会一下子开辟出所有的内存空间,用到的时候才开,不会造成内存浪费。list = range(0, 4) # 得到list = range(0, 4) type(list) # <type 'xrange'>总结,python3弃用了xrange,但python3的range功能和python2的xrange一样,都是一个生成器。
2021年01月05日
216 阅读
0 评论
3 点赞
2020-12-19
python内置小工具
1. 字符串转换为JSON由于JSON的诸多优点,已被广泛应用于各个系统中,将JSON字符串转换为JSON对象的需求十分常见。而除了打开浏览器使用在线JSON格式化工具外,我们也可以使用命令行的Python解释器来解析JSON字符串windows系统下,直接在cmd执行即可:echo {"desktop": [{"name": "Bandizip", "version": "6.26", "remove": "D:/software/Banzip/Uninstall.exe", "brandname": "Bandisoft.com", "remark": {"Installtime": "-"}, "start": "-"}, {"name": "Git version 2.28.0", "version": "2.28.0", "remove": "E:/IDE_Tools/Git/unins001.exe", "brandname": "The Git Development Community", "remark": {"Installtime": "20201111"}, "start": "-"}]} | python -m json.toolPS: linux系统下执行需要用引号把JSON字符串括起来,windows括起来执行错误2. 检测第三方库是否正确安装安装完Python的第三方库以后,如何确认这个库已经正确安装了呢?,一般我们直接用import导入模块,如果导入没有任何错误,则认为安装成功,但如果想要快速并且可以在脚本中执行的话,Python给我们提供了方法:python -c "import celery"
2020年12月19日
112 阅读
0 评论
2 点赞
2020-12-19
python快捷创建一个下载服务器用于传输文件
目前我们都通过聊天工具来传输文件,而文件稍大或者数量很多的情况下很容易错乱,反而降低办事效率,今天介绍一下python内置的下载服务器:1. 首先进入你想要传输文件的目录下,进入目录后执行以下命令:Python2 语法:python -m SimpleHTTPServerPython3 语法:python -m http.server2. 执行命令后把ip和端口告诉朋友即可,默认打开8000端口如图所示:使用浏览器访问,可以看到如图的一个类似FTP下载的界面,这个时候,单击文件下载即可。PS:上面使用的Python语句,从工作原理上来说,仅仅是启动了一个Python内置的Web服务器。如果当前目录下存在一个名为index.html的文件,则默认显示该文件的内容。如果当前目录下不存在这样一个文件,则默认显示文件列表,也就是大家看到的下载服务器
2020年12月19日
152 阅读
0 评论
2 点赞
2020-12-09
python执行cmd命令
python 操作cmd通常使用os模块执行cmdos.system(执行的命令)控制台可以打印输出结果但无法获取,默认情况下代码0代表执行成功,如果执行的进程自定义了成功返回值,可能就不是0了。os.popen(执行的命令)输出后的内容是一个对象,默认是以读的方式打开,可以通过读取文件对象,获取返回的信息内容。
2020年12月09日
411 阅读
0 评论
1 点赞
2020-11-19
celery worker启动报错:AttributeError: 'str' object has no attribute 'items'
1.错误演示[2020-11-18 11:11:41,548: ERROR/MainProcess] Unrecoverable error: AttributeError("'str' object has no attribute 'items'",) Traceback (most recent call last): File "E:\PyCharm_code\Venv\djtest1\lib\site-packages\celery\worker\__init__.py", line 206, in start self.blueprint.start(self) File "E:\PyCharm_code\Venv\djtest1\lib\site-packages\celery\bootsteps.py", line 123, in start step.start(parent) File "E:\PyCharm_code\Venv\djtest1\lib\site-packages\celery\bootsteps.py", line 374, in start return self.obj.start() File "E:\PyCharm_code\Venv\djtest1\lib\site-packages\celery\worker\consumer.py", line 280, in start blueprint.start(self) File "E:\PyCharm_code\Venv\djtest1\lib\site-packages\celery\bootsteps.py", line 123, in start step.start(parent) File "E:\PyCharm_code\Venv\djtest1\lib\site-packages\celery\worker\consumer.py", line 884, in start c.loop(*c.loop_args()) File "E:\PyCharm_code\Venv\djtest1\lib\site-packages\celery\worker\loops.py", line 103, in synloop connection.drain_events(timeout=2.0) File "E:\PyCharm_code\Venv\djtest1\lib\site-packages\kombu\connection.py", line 288, in drain_events return self.transport.drain_events(self.connection, **kwargs) File "E:\PyCharm_code\Venv\djtest1\lib\site-packages\kombu\transport\virtual\__init__.py", line 847, in drain_events self._callbacks[queue](message) File "E:\PyCharm_code\Venv\djtest1\lib\site-packages\kombu\transport\virtual\__init__.py", line 534, in _callback self.qos.append(message, message.delivery_tag) File "E:\PyCharm_code\Venv\djtest1\lib\site-packages\kombu\transport\redis.py", line 146, in append pipe.zadd(self.unacked_index_key, delivery_tag, time()) \ File "E:\PyCharm_code\Venv\djtest1\lib\site-packages\redis\client.py", line 2685, in zadd for pair in iteritems(mapping): File "E:\PyCharm_code\Venv\djtest1\lib\site-packages\redis\_compat.py", line 159, in iteritems return iter(x.items()) AttributeError: 'str' object has no attribute 'items'2.解决办法报错的原因在于redis版本过高,对redis降级就可以了卸载redispip uninstall redis重新安装redispip install redis==2.10.6
2020年11月19日
739 阅读
0 评论
0 点赞
2020-11-18
30分钟学完Python基础语法
有一门面向对象语言的基础,30分钟足够看一遍Python的基础了该文章转载自友人c一. 基础语法# 缩进取代大括号 # 用换行取代分号,也可以使用分号,无所谓 # 输出 print(); # 输入 input(); # 注释 #单行注释 """ 多行注释1 """ ''' 多行注释2 ''' # 申明变量 直接写字母就行与数字、下划线组合即可,不是保留字即可。 # if if true: print("true") else: print("false") # while i = 0; while i <= 1: #do something print("cicle") i+=1 # for languages = ["C", "C++", "Perl", "Python"] for x in languages: print (x) # range range(5)函数返回数字0~4的数组 range(5,9) 函数返回数字5~8的数组 range(0,10,3) 函数返回从数字0开始,递增3,直到最后一个数字小于10的数字数组 range(-10,-100,-30) 函数返回从-10开始,递增-30,直到最后一个数组大于-100的数字数组 # for + range 带索引遍历数组 a = ['Google', 'Baidu', 'Runoob', 'Taobao', 'QQ'] for i in range(len(a)) print(i,a[i]) # while 带索引遍历数组 i = 0; length = len(a); while i < a: print(i,a[i]) i+=1 # for + enumerate 带索引遍历数组 for i,value in enumerate(a): print(i,value) # 列表list # python list 和java list性质很类似,而不是数组,它的大小可变,但是Python列表的元素可以使把不同的数据类型,非常灵活 # 创建新的list list1 = [] list2 = ['bob',1,2] # 增加元素 list1.append(233) list1.insert(0,666) #插入到0位置,原来元素依次后移 # 删除元素 list2.pop() #删除末尾的元素 list2.pop(0) # 修改元素 = 直接赋值 # 访问指定位置元素 list1[1] list1[-1] #表示最后一个元素 # 切片(返回一个子列表) list2[0:2] #表示从索引0到1的元素 list2[-2:-1] #表示倒数第二个元素 list2[:3] #表示从0到2 list2[1:] #表示从1到结尾 # 元组tuple # 与list列表区别是,tuple一旦初始化就不能修改。 # list使用[]方括号,tuple使用()圆括号 # 定义时候,只有一个元素,需要加一个,,避免歧义 t = (1,) # 字典dict # dict 和 java的map很类似。键值对,Python的dict很类似json的语法 # 定义 d = {'age':62, 'sex':'male'} # 访问值 d['age'] # 判断key是否存在 d.get('name') #默认不存在返回none d.get('name',-1) #指定不存在时候返回-1 'name' in d #不存在时候返回false # 删除key d.pop('sex') # 集合set # 和java的set性质很类似,也是没有重复元素的集合。 # 定义 s = set([1,1,2,2,2,3,3,'sex']) # 添加元素 s.add(4) s.add(4) # 重复元素添加操作不会生效 # 删除元素 s.remove('sex') #参数是set元素的值,而不是索引 # 函数 # 定义函数 def my_function(x): print(x); # 调用函数 my_function("Hello,World!")二. 高级特性1. 列表生成式和生成器1.1 列表生成式一种快速生成一个指定条件的列表的语法第一个例子:生成数字0-10的列表,可以使用range(0, 11)函数,这个并不是列表生成器,只是引出这个概念第二个例子:生成[1x1, 2x2, 3x3, ..., 10x10] 这样乘积结果形成的列表,普通写法是一层循环:l = [] for x in range(1,11): l.append(x*x) # 或者下面的循环 i = 1 while i < 11: l.append(i*i) i+=1现在使用列表生成式只需要一句代码:[x*x for x in range(1,11)]仔细看下上面代码,可以发现,就是把l.append(x*x)替换成x*x,并写在了for循环前面,而且整体用列表的符号[]包裹起来。还可以更进一步,在for循环后面,写if语句,进一步筛选需要生成的元素:[x * x for x in range(1, 11) if x % 2 == 0] # [4, 16, 36, 64, 100]可以说,列表生成式就是一种语法的简化,没什么新的功能。1.2 生成器列表生成式是真实返回一个生成好的列表。但是如果我们需要生成的列表特别大,被逼入100万的成员,但我们只需要打印前几个元素,后面那个多成员所占用的空间就浪费了:L = [x * x for x in range(1000000)] print(L[0]) print(L[1])上面写法就是非常浪费,要遭到我们谴责的。可以用下面写法:g = (x * x for x in range(1000000)) next(g) next(g)这种写法的返回的并不是一个列表,而是一个生成器g。生成器就好比一个记住规则的工具,一开始并不会生成任何元素,通过调用next()一个个的生成数组元素。加入我想生成10个元素,我可以迭代生成器:g = (x * x for x in range(10)) for x in g: print(x)上面语法可以创建一个生成器,还可以通过yield关键字使一个函数成为生成器:def odd(): print('step 1') yield 1 print('step 2') yield(3) print('step 3') yield(5) g = odd() next(g) # step 1 next(g) # step 2 next(g) # step 3 next(g) # StopIteration同样可以使用for循环迭代这个生成器:for x in odd(): print(x) # 依次返回1 3 5一个函数成为生成器,使用next调用函数,遇到yield语句会返回yield申明的值(常量/变量)。再次调用next从上次返回的位置继续,直到遇到下一个yield语句。2. 迭代器首先需要区分两个概念:迭代器(Iterator)和可迭代对象(Iterable):可迭代对象:可以使用for遍历,但是不能被next()调用,不断的返回下一个值。迭代器:可以通过调用next(Iterator),不断返回迭代器内部的值通过isinstance([变量] , Iterator)或isinstance([变量] , Iterable) 判断变量是否是迭代器或是可迭代对象list、dict、str本身不是迭代器,可以通过iter(Iterable)返回迭代器对象生成器本身就是迭代器对象。l = [1, 2, 3, 4, 5] lIter = iter(l) next(lIter) # 返回1三. 函数式编程1. 装饰器设计模式里有一个设计模式就是装饰器模式,其实很容易理解,就是对函数进行扩展功能。但是又不想通过继承的方式。用装饰器函数把原函数包裹起来,先执行装饰器的功能,再调用原函数。所以装饰器的参数首先需要原函数func_name,而且装饰器内部还需要定义一个函数wrapper,参数是*args, **kw,表示任意参数,用来接收调用原函数的参数。举个例子,定义一个log的装饰器,可以装饰在任何函数上(方式是在需要装饰的函数顶部写@装饰器名称),执行原函数,会输出该函数的调用信息:def log(func): def wrapper(*args, **kw): print("调用函数%s()"% func.__name__) return func(*args, **kw) return wrapper @log def now(str): print("一个测试函数 + %s" % str)当我们执行now("哈哈"),实际上执行的是log(now("哈哈")),然后log函数内部调用wrapper("哈哈"),先打印测试时间,再执行了now("哈哈")装饰器也可以传值,但是装饰器内部再多一个函数,用来接收需要装饰的函数名:def log(text): def decorator(func): def wrapper(*args, **kw): print("调用函数%s()时间为,测试文字 %s" % (func.__name__ ,text)) return func(*args, **kw) return wrapper return decorator @log("自定义文字") def now(str2): print("一个测试函数 + %s" % str2)这样调用now("哈哈"),实际上调用了log("自定义文字")now("哈哈"),然后执行decorator(now("哈哈")),下面的调用过程和之前一样了。被装饰器修饰的函数,会有一个问题:打印他的函数名称会有问题:比如now.__name__,会输出wrapper,我们可以在wrapper的函数,上面写一句:import functools def log(func): @functools.wraps(func) def wrapper(*args, **kw): print("调用函数%s()"% func.__name__) return func(*args, **kw) return wrapper这句注解自动会帮我们wrapper.__name__ = func.__name__赋值。四. 面向对象编程我们用java的类概念来引入Python的面向对象的所有概念:1. 类class Student(object): def __init__(self, name, score, sex): self.name = name self.score = score self.__sex = sex; def print_score(self): print('%s: %s' % (self.name, self.score)) st = Student("hewro",120,"male") print(st.name) st.print_sore()从上面代码,我们可以看出:成员变量是在__init__中定义,而不是直接申明变量构造函数名称是__init__,Python不支持函数重载,自然只能有一个构造函数了。而且第一个参数一定是self,生成实例的时候,不需要手动调用该参数。在类的内部使用本身的变量,需要在函数第一个参数添加self,很麻烦继承父类的写法不是extend,而是(父类)python 的私有变量定义也没有关键字,只是定义变量名称前面加两个下划线__,如__sex,就无法直接打印std.__sex2. 关于多态我们知道多态是继承带来的一个很好特性。java、Python都有。但是Python本身变量不需要申明类型,所以多态实现,并不一定需要是定义父类的子类,而只要是该对象也拥有指定的方法即可(即鸭子类型)。比如我们有一个Animal的父类,还有继承Animal的Dog和Cat 子类class Animal(object): def run(self): print('Animal is running...') class Dog(Animal): def run(self): print('Dog is running...') class Cat(Animal): def run(self): print('Cat is running...') class Tortoise(Animal): def run(self): print('Tortoise is running slowly...') # 这个函数的参数实际上是没有申明类型的 def run_twice(animal): animal.run() animal.run() 所以执行run_twince()参数可以是dog实例,也可以是Tortoise的实例,虽然Tortoise并不继承于Animal。
2020年11月18日
294 阅读
0 评论
2 点赞