python0-常规操作
文章目录1,固定小数点后的位数2,文件校验器3,进制转换4,运行脚本后进入交互模式5,虚拟环境设置6,控制台输出带颜色的文字方法7,python源码打包及加密(PyInstaller、Nuitka;cython、jmpy3、docker;PyArmor-收费;法律约束条款;靠服务收费而非产品收费;BeeWare)8,反射(由字符串获取与之同名的对象的值,getattr,globals())9,Py
文章目录
- 1,固定小数点后的位数
- 2,文件校验器
- 3,进制转换
- 4,运行脚本后进入交互模式
- 5,虚拟环境设置
- 6,控制台输出带颜色的文字方法
- 7,python源码打包及加密(PyInstaller、Nuitka;cython、jmpy3、docker;PyArmor-收费;法律约束条款;靠服务收费而非产品收费;BeeWare)
- 8,反射(由字符串获取与之同名的对象的值,getattr,globals())
- 9,Python图像库PIL的类Image及其方法
- 10,Python与C混编
- 11,cupy-一个由 CUDA 加速的 NumPy 兼容数组库
- 12,样板代码合集网站
- 13,安装python后cmd输入python和pip无效
- 14,pip配置国内镜像源
- 15,dll注入
- 16,字典根据value得到key:
- 17,多重条件排序
- 笔记
1,固定小数点后的位数
'''字符串格式化输出'''
'%.3f'%(10.1111111111)
'{:.3f}'.format(10.3333333333)
'''浮点数四舍五入'''
>>> a = 0.123456789
>>> for i in range(9):
... round(a, i)
2,文件校验器
import hashlib
res = hashlib.sha256()
i = 0
with open('pycharm-community-2021.1.1.exe', 'rb') as f:
for line in f:
print(line)
res.update(line)
i+=1
print(res.hexdigest())
print(i)
source = input('原始编码:')
print(str(res.hexdigest()) == source)
3,进制转换
3.1,
3.2,十进制转为固定长度的二进制
‘{:032b}’.format()
4,运行脚本后进入交互模式
python -i 脚本
5,虚拟环境设置
https://www.cnblogs.com/dcpeng/p/12251291.html (python virtualenv)
https://www.cnblogs.com/dcpeng/p/12257331.html (pycharm,创建直接用pycharm也可以)
如果你加了参数: --no-site-packages出现了错误virtualenv: error: unrecognized arguments: --no-site-packages,那可以去掉了。因为virtualenv早就默认这个参数了
virtualenv ~
或者使用 --system-site-packages,但会将真实环境所有的库都复制过来
virtualenv --system-site-packages ~
6,控制台输出带颜色的文字方法
https://www.cnblogs.com/Eva-J/p/8330517.html
如果要在cmd中显示颜色,需要加上
from colorama import init
init(autoreset=True)
7,python源码打包及加密(PyInstaller、Nuitka;cython、jmpy3、docker;PyArmor-收费;法律约束条款;靠服务收费而非产品收费;BeeWare)
- 一、桌面图形程序(PyQt5、Tkinter、WxPython 等框架编写的图形程序)加密
- 使用 PyInstaller: pyinstaller -F ***.py 进行打包,生成平台的二进制运行文件,比如 Windows 下的 exe 文件。但是使用 PyInstaller 编译打包出来的程序,很容易被反编译回去;比如,使用pyinstxtractor这个工具,就能把 PyInstallers 编译出来的 exe 还原回去;之后,再对还原出来的 pyc 文件进行反编译即可。
- Nuitka 会将 Python 程序转化为 C 语言程序,然后再进行编译打包为二进制文件。众所周知,反编译 C 程序的难度是巨大的。以此,我们就极高地保障了图形界面程序的源码安全性。
- 二 、Web 应用程序
- 将 Python 代码文件编译为 C 文件,然后再将 C 文件编译为操作系统的动态链接库文件(Linux 下的 .so 文件和 Windows 下的 .pyd 文件)。以上步骤需要使用第三方库 cython,然后编写一个setup.py文件用来指定需要处理的 Python 文件,例如:
from distutils.core import setupfromCython.Buildimport cythonizesetup(ext_modules = cythonize(["zmister.py"]))
- 有一个第三方库 jmpy3 对上述流程进行了优化,支持单个文件和整个项目进行编译,使用起来更加友好
- 需要注意的是,使用这种方式加密后的文件需要使用生成时的 Python 版本,这也算是一个小缺点。但是这个缺点可以通过打包为 Docker 镜像的方式解决掉。
- 三、通用加密
- PyArmor 是一个用于加密和保护 Python 脚本的工具。它能够在运行时刻保护 Python脚本的二进制代码不被泄露,设置加密后 Python 源代码的有效期限,绑定加密后的Python源代码到硬盘、网卡等 硬件设备。它的保障机制主要包括:
- 加密编译后的代码块,保护模块中的字符串和常量
- 在脚本运行时候动态加密和解密每一个函数(代码块)的二进制代码
- 代码块执行完成之后清空堆栈局部变量
- 通过授权文件限制加密后脚本的有效期和设备环境
- 除了对 Python 代码进行加密,PyArmor 还能设置 Python 程序的许可方式,比如设置程序的使用期限、设置允许运行的设备、扩展其他认证方式等
- 需要注意的是,pyarmor 是一个共享软件,安装之后处于试用模式,在试用模式下有一些限制,如果购买的话需298
pip install pyarmor pyarmor obfuscate foo.py #使用obfuscate选项对代码进行加密 pyarmor licenses \--expired "2018-12-31" \--bind-disk "100304PBN2081SF3NJ5T" \--bind-mac "70:f1:a1:23:f0:94" \--bind-ipv4 "202.10.2.52" \ r001 #使用licenses 选项生成许可文件 pyarmor obfuscate --with-license licenses/r001/license.lic foo.py #使用--with-license参数指定许可文件 pyarmor pack foo.py #使用pack选项打包脚本
- PyArmor 是一个用于加密和保护 Python 脚本的工具。它能够在运行时刻保护 Python脚本的二进制代码不被泄露,设置加密后 Python 源代码的有效期限,绑定加密后的Python源代码到硬盘、网卡等 硬件设备。它的保障机制主要包括:
https://mp.weixin.qq.com/s/qsLoVIB1tC8cVRMp2jmSUw
- 四、打包为Android包
BeeWare
8,反射(由字符串获取与之同名的对象的值,getattr,globals())
- getattr(object, name[, default]): 用于返回一个对象属性值,获取对象属性后返回值可直接使用。
>>>class A(object):
... bar = 1
...
>>> a = A()
>>> getattr(a, 'bar') # 获取属性 bar 值
1
>>> getattr(a, 'bar2') # 属性 bar2 不存在,触发异常
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'A' object has no attribute 'bar2'
>>> getattr(a, 'bar2', 3) # 属性 bar2 不存在,但设置了默认值
3
>>>
- 对于当前全局变量进行反射有两种方法: getattr, globals()
'''方法1'''
>>> a = 1
>>> getattr(sys.modules['__main__'], 'a')
1
'''方法2'''
>>> globals()['a']
1
- globals()还可以用于使用字符串生成变量名
>>> globals()['cccc']=1
>>> cccc
1
9,Python图像库PIL的类Image及其方法
https://blog.csdn.net/leemboy/article/details/83792729
10,Python与C混编
Cython入门教程 : https://www.jianshu.com/p/cfcc2c04a6f5
用Cython加速Python到“起飞”:https://www.jb51.net/article/166720.htm
Python/C API Reference Manual: https://docs.python.org/3/c-api/index.html
11,cupy-一个由 CUDA 加速的 NumPy 兼容数组库
- 安装
# For CUDA 8.0
pip install cupy-cuda80
# For CUDA 9.0
pip install cupy-cuda90
# For CUDA 9.1
pip install cupy-cuda91
# For CUDA 9.2
pip install cupy-cuda92
# For CUDA 10.0
pip install cupy-cuda100
# For CUDA 10.1
pip install cupy-cuda101
# Install CuPy from source
pip install cupy
- 应用
https://docs.cupy.dev/en/stable/
12,样板代码合集网站
https://www.programcreek.com/python/
13,安装python后cmd输入python和pip无效
将***\python以及***\python\Scripts配置到环境变量中
14,pip配置国内镜像源
https://blog.csdn.net/weixin_42151880/article/details/108084264
pycharm中也可以设置
15,dll注入
- dll(dynamic lick library,动态链接库;与静态链接库相对),是windows系统中实现共享函数库概念的一种方法,这些库函数的扩展名是’.dll’,’.ocx’(包含activex控制的库),’.drv’(旧式的系统驱动)。
- dll注入:可以利用dll机制实现进程通信或控制其他进程的应用程序。dll注入是让进程A前行加载程序B给定的a.dll,并执行程序B给定的a.dll中的代码。进程A不会主动加载B给定的a.dll,需要程序B通过某种手段让A加载,此时a.dll进入进程A的地址空间,并对进程A产生影响。
- 正常需要dll注入的情况:
- 为目标进程添加新的实用功能;
- 需要一些手段辅助调试被注入dll的进程;
- 为目标进程安装钩子程序(API Hook,可以截获数据流中的数据,对数据进行修改后发送给指定的进程/或者直接丢弃,pytorch中也有类似的概念)。
- dll注入的方法:
- 修改注册表
- 使用CreateRemoteThread函数对运行中的进程注入dll
- 使用SetWindowsHookEx函数对应用程序挂钩(HOOK)迫使程序加载dll(杀毒软件常用钩子进行处理)
- 替换应用程序一定会使用的dll
- 将dll作为调试器注入
- 用CreateProcess对子程序注入dll
- 修改被注入进程的exe的导入地址表
- 利用python调用SetWindowsHookEx函数对应用程序挂钩(HOOK)迫使程序加载dll
- ctypes是python外部函数库,从python2.5开始引入,提供了c兼容的数据类型,并且允许调用动态链接库/共享库中的函数,它可以将这些库包装起来给python使用。
- ctypes.windll.user32
- 消息钩子:Windows操作系统为用户提供了GUI(Graphic User Interface,图形用户界面),以事件驱动方式工作。在操作系统中借助键盘、鼠标、选择菜单、按钮、移动鼠标、改变窗口大小时,操作系统会将事先定义好的消息发送给相应的应用程序,应用程序分析收到的消息并进行执行。也就是说,敲击键盘时,消息会从操作系统移动到应用程序,消息钩子则可在此期间提取这些信息。
16,字典根据value得到key:
'''方法1'''
def get_key(value):
for k,v in dict.items():
if value == v:
return k
'''方法2:反转字典'''
new_dict = {v:k for k,v in dict.items()}
17,多重条件排序
sorted中的key函数返回元组,会先按照元组第一个元素排序;如果第一个元素相同,按照元组第二个元素排序。
- 按照元组的第一个从小到大排序
- 如果第一个相同 则按照元组第2个从大到小 排序
a = [[2,3],[4,1],(2,8),(2,1),(3,4)]
b = sorted(a,key=lambda x: (x[0], -x[1]))
print b
musicBase = {'a': 5, 'b': 4, 'c': -2, 'd': -1, 'e': -1, 'f': 4}
musicSorted = sorted(musicBase.items(), key=lambda x: (x[1], -ord(x[0][-1])), reverse=True)
笔记
笔记1-python3中sort函数key如何对两个参数做对比
笔记2-装饰器模板
笔记3-递归
笔记4-抽象类
笔记5-新式类广度优先多继承的继承顺序
笔记6-网络编程
笔记7-类的装饰器(property, classmethod, staticmethod)
笔记8-多进程
笔记9-多线程
笔记10-协程
更多推荐
所有评论(0)