Eastsheng's Wiki

Python奇淫巧计-1

2022-06-16 10:48:28

[toc]

图像处理

旋转图片

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import cv2
def Rotation(image,degree):
src= image
rows, cols, channel = src.shape
# 绕中心旋转
# 参数:旋转中心,旋转度数,scale
M = cv2.getRotationMatrix2D((cols/2, rows/2), degree, 1.09)
# 参数: 原始图像,旋转参数, 元素图像高度
rotated = cv2.warpAffine(src, M, (cols, rows),borderValue=(255, 255, 255))
# 显示旋转后的图像
# cv2.imshow("demo1", rotated)
cv2.waitKey()
cv2.destroyAllWindows()
return rotated

for i in range(180):
image = cv2.imread('./fig.png')
img = Rotation(image, -i)

# cv2.imshow('ww1', img)
print(i)
cv2.waitKey()
cv2.imwrite("./img/rotateImg_"+str(i)+".png",img)

python函数模块化,并安装在本地调用

  • 首先,把编写好的函数写在一个指定文件(example:xxx.py)里,并放到一个文件夹(example:xxx)里。
  • 接着,在这个文件夹里写一个setup.py文件,文件内容例如:
1
2
3
4
5
6
7
8
9
10
11
12
$ from distutils.core import setup

$ setup(
$ name = 'thermal_conductivity',
$ version = '1.0.0',
$ py_modules = ['thermal_conductivity'],
$ author = 'eastsheng',
$ author_email = 'eastsheng@hotmail.com',
$ url = 'https://github.com/eastsheng',
$ description = 'Calculate thermal conductivity according to NEMD dump.'
)

  • 打包前MANIFEST.in包括和排除文件/文件夹
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 包含匹配指定模式的文件
include example.txt
# 排除匹配指定模式的文件
exclude example.txt
# 递归地包含匹配指定模式的文件
recursive-include dir_name *.txt
# 递归地排除匹配指定模式的文件
recursive-exclude dir_name *.txt
# 包含指定目录及其所有内容
graft dir_name
# 排除指定目录及其所有内容
prune dir_name
# 包含所有匹配指定模式的文件
global-include *.txt
# 排除所有匹配指定模式的文件
global-exclude *.pyc
  • 然后,在此文件夹里打开cmd,输入:
1
$ python setup.py sdist
  • 最后,安装此模块到本地,输入:
1
$ pip install .

python包上传至PYPI

  • 安装 setuptoolswheel 库,这两个库是 Python 的包打包工具,可以用来生成安装包和源码包,twine用来上传PyPI:

    1
    2
    pip install setuptools wheel
    pip install twine
  • 编写 setup.py 文件,这个文件描述了项目的元数据和打包方式。这个文件通常位于项目的根目录下,下面是一个示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    """run this
    python setup.py sdist
    pip install .
    """

    # from distutils.core import setup
    from setuptools import setup, find_packages

    setup(
    name = 'ReadLog',
    version = '1.1.0',
    py_modules = ['ReadLog'],
    author = 'CHENDONGSHENG',
    author_email = 'eastsheng@hotmail.com',
    packages=find_packages('src'),
    package_dir={'': 'src'},
    install_requires=open('requirements.txt').readlines(),
    url = 'https://github.com/eastsheng/ReadLog',
    description = 'Read themo info from lammps output file or log file'
    )
  • 在项目的根目录下执行以下命令生成源码包和安装包:

    1
    2
    python setup.py sdist
    twine upload dist/*

打包Python程序为exe

打包后可以在Windows上运行,而不需要安装程序里需要的各种包。

(1). 安装第三方包pyinstaller

(2). 在cmd命令行输入:

1
pip install pyinstaller

(3). 如果嫌慢,或者失败,可以用国内镜像网址下载安装:

1
pip install pyinstaller -i https://pypi.douban.com/simple

或者设置Windows国内镜像,具体参考这里:

  • 在 windows “文件资源管理器” 地址栏 输入 %APPDATA% 回车;或者直接找到路径C:\Users\yourcomputer\AppData\Roaming

  • 创建名为pip的文件夹

  • 在里面新建名为 pip.ini 的配置文件

  • 在 pip.ini 文件中输入以下内容,然后保存

    1
    2
    3
    4
    [global]
    index-url=http://mirrors.aliyun.com/pypi/simple/
    [install]
    trusted-host=mirrors.aliyun.com
  • 然后可以试试快不快

(4). cmd执行:

1
pyinstaller -F filename.py 

(5). 还可以给程序加个图标:

1
2
pyinstaller -i <图标名.ico> -F filename.py

(6). 其他需要用到的命令

1
2
3
4
5
pyinstaller -h             为查看help命令
pyinstaller --clean 为清理打包过程中的临时文件
pyinstaller -D,--onedir 为默认值,生成dist文件夹
pyinstaller -F,--onefile 为在dist文件夹中只生成独立的打包文件
pyinstaller -i <图标名.ico> -F filename.py为指定打包程序使用的图标文件

turtle画太极

画太极;打包后的exe文件

太极
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#画个太极阴阳鱼
import turtle
turtle.setup(0.5,0.6,0,0)
turtle.speed(10)
# #大圆
# turtle.penup()
# turtle.goto(0,-160)
# turtle.pendown()
# turtle.circle(180)
#画阴鱼
turtle.begin_fill()
turtle.fillcolor('black')
turtle.left(180)
turtle.penup()
turtle.goto(0,200)
turtle.pendown()
turtle.circle(90,180)
turtle.circle(-90,180)
turtle.left(180)
turtle.circle(180,180)
turtle.end_fill()
#画阴鱼
turtle.circle(180,180)
#白眼
turtle.begin_fill()
turtle.fillcolor('white')
turtle.penup()
turtle.goto(0,80)
turtle.pendown()
turtle.circle(40)
turtle.end_fill()
#黑眼
turtle.begin_fill()
turtle.fillcolor('black')
turtle.penup()
turtle.goto(0,-120)
turtle.pendown()
turtle.circle(40)
turtle.end_fill()
#太极
turtle.penup()
turtle.goto(-275,0)
turtle.pendown()
turtle.write("太",font=("华文行楷",30,"normal"))
turtle.penup()
turtle.goto(-275,-50)
turtle.pendown()
turtle.write("极",font=("华文行楷",30,"normal"))
turtle.penup()
turtle.goto(200,-120)
turtle.pendown()
turtle.write("---2020/3/17",font=("方正",12,"normal"))
turtle.penup()
turtle.goto(250,-150)
turtle.pendown()
turtle.write("sheng",font=("华文行楷",12,"normal"))

turtle.hideturtle()
turtle.done()

if name == ‘main‘:

1
if __name__ == '__main__':
  • 为什么有的执行代码前都要写一个if
  • __name__Python中一个隐含的变量它代表了模块的名字
  • 只有被Python解释器直接执行的模块的名字才是__main__
  • 也即是,除非直接执行该代码,否则是不会执行if __name__ == '__main__':下面的代码的。
  • if __name__ == '__main__':下的变量是全局变量

文件、路径后缀等操作

os.path.split() 分离文件路径与文件名

1
2
3
4
5
import os
fullpath = 'E:/xxx/xxx.py'
(path, f) = os.path.split(fullpath)
# print(path, f)
# E:/xxx xxx.py

os.path.splitext() 分离文件名与后缀

1
2
3
4
5
import os
filename = 'xxx.py'
(f, suffix) = os.path.splitext(filename)
# print(f, suffix)
# xxx .py

字典操作

定义字典

1
2
3
4
5
HeavyOil_dict ={
"Sat":[1,83],
"Aro":[84,117],
"Res":[118,170],
"Asp":[171,235]}

字典键索引值

1
HeavyOil_dict["Sat"]

字典不能索引

  • 字典不能索引,可以直接改为list后索引
    1
    HeavyOil_Label = list(HeavyOil_dict.keys())

List操作

去除list的括号与引号

1
2

lc = "\t".join(str(i) for i in l)

列表解析式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#普通

a=[]

for i in range(1,11):
a.append(i)
print(a)
#1.列表解析式
b=[i for i in range(1,11)]
print(b)
#结果[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
#其中第一个i表示要放入b列表中的数据,进一步理解
c=[i**2 for i in range(1,11)]
print(c)
#结果[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
#2.字典类型的解析式
d={i:i**2 for i in range(1,11)}
print(d)
#结果{1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81, 10: 100}

count某个元素在列表中出现的次数

1
2
3
some_list = ['a', 'b', 'c', 'b', 'd', 'm', 'n', 'n']
m = some_list.count("b")
print(m)

Useful Python Librarys

  • 用于制作简单 GUI 程序的 Python 库。换一种简单的方式写 GUI(图形用户界面)程序

1
2
3
4
5
6
7
8
9
10
11
12
from guietta import _, Gui, Quit
gui = Gui(
[ "Enter numbers:", "__a__", "+", "__b__", ["Calculate"] ],
[ "Result: -->", "result", _, _, _ ],
[ _, _, _, _, Quit ]
)

with gui.Calculate:
gui.result = float(gui.a) + float(gui.b)

gui.run()

导出与安装requirements.txt

  • 导出环境中所有依赖库

    1
    pip freeze > requirements.txt
  • 指定项目文件夹中依赖库

    1
    2
    pip install pipreqs
    pipreqs xxx ## xxx代表项目路径
  • 在其他环境安装requirements.txt中依赖库

    1
    pip install -r  requirements.txt 

运行Python时传入参数

具体实现

  • 如下run.py
    1
    2
    3
    4
    5
    import sys
    x = sys.argv[1] # 传入参数1
    y = sys.argv[2] # 传入参数2
    print("第一个参数为:",x)
    print("第二个参数为:",y)
  • 具体运行方法:
    1
    python run.py 1 2
  • output
    1
    2
    第一个参数为: 1
    第二个参数为: 2

若要可以直接运行脚本

  • 如在Linux中运行,可在脚本中添加#!/usr/bin/python
    1
    2
    3
    4
    5
    6
    #!/usr/bin/python
    import sys
    x = sys.argv[1] # 传入参数1
    y = sys.argv[2] # 传入参数2
    print("第一个参数为:",x)
    print("第二个参数为:",y)
  • 若要可执行,还需给脚本设置权限
    1
    chmod +x ./run.py # 视情况添加sudo

Python调用其他语言

调用C/C++

1. CTypes

1
2
3
4
import ctypes
CL = ctypes.cdll.LoadLibrary
lib = CL("./test.so")
lib.func()

2. SWIG

3. Python/C API

4. Cython

调用Fortran

使用numpy中的f2py

  • hello_fortran.f90

1
2
3
4
5
6
subroutine hello (a)
implicit none
integer a
write(*,*)'Hello from Fortran90!!!', a
return
end subroutine hello
  • 使用f2py编译fortran

    1
    f2py -m hello_fortran -c hello_fortran.f90
  • python中调用

    1
    2
    import hello_fortran as hf
    hf.hello(45)

减少内存占用

__slots__例子:

  • 创建许多对象(成千上万个),它会消耗掉很多内存
    1
    2
    3
    4
    5
    6
    7
    class MyClass(object):
    __slots__ = ['name', 'identifier']
    def __init__(self, name, identifier):
    self.name = name
    self.identifier = identifier
    self.set_up()
    # ...

pypy安装

Linux命令行安装pypy和pypy3

1
2
sudo apt-get install pypy pypy-dev #pypy2
sudo apt-get install pypy3 #pypy3

Linux手动安装pypy3

  • 官网下载最新的pypy版本,直接解压tar -xf pypy3.8-v7.3.7-linux64.tar.bz2
  • 创建软链:sudo ln -s /root/pypy3-v6.0.0-linux64/bin/pypy3 /usr/local/bin 创建软链
  • pypy安装成功,输入pypy3测试 pypy3 xxx.py 运行python文件
  • 然后开始安装pip命令
    • 下载 wget https://bootstrap.pypa.io/get-pip.py
    • 然后执行pypy3 get-pip.py
    • 测试pip是否安装成功pypy -m pip install numpy
  • 还可安装自己的库:
    1
    pypy3 setup.py install

卸载pypy

  • 完全卸载pypy(软件及相关配置)
    1
    sudo apt-get remove --purge pypy
  • 完全卸载pypy及其依赖软件(慎用!这里会删除pypy及依赖pypy的软件包,一般上面第一条命令已经够用)
    1
    2
    sudo apt-get remove --auto-remove pypy
    sudo apt-get purge --auto-remove pypy
  • 清除pypy及其依赖软件的安装包
    1
    sudo apt-get autoclean pypy

BUG

  • 部分第三方库不兼容
  • 此处查看

参考

自动给数字前面补0的方法

1
2
3
4
n = "123"
s = n.zfill(5)
# output
00123

一款 AI 修复神器Lama Cleaner

  • 安装好后,就可以启动一个 web 服务了。
    1
    2
    3
    4
    pip install lama-cleaner
    # Models will be downloaded at first time used
    lama-cleaner --model=lama --device=cpu --port=8080
    # Lama Cleaner is now running at http://localhost:8080

查找路径下目录或文件glob

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
"""
定义一个函数,搜索e f盘下的所有文件和目录,并返回一个列表(这里使用import glob)
"""
import glob

def search():
f = glob.glob(r'E:\E-book\*') #返回一个列表
print(f)

def searchi():
f = glob.glob(r'F:\*.bin') #返回一个路径或文件
for i in f:
print(i)

if __name__ == "__main__":
search()
searchi()