Marco Nie - python 2024-07-01T10:17:13+08:00 Typecho https://blog.niekun.net/feed/atom/category/py/ <![CDATA[使用虚拟环境 env 开发 python]]> https://blog.niekun.net/archives/env-python.html 2024-07-01T10:17:13+08:00 2024-07-01T10:17:13+08:00 admin https://niekun.net 使用虚拟环境进行Python开发有助于隔离项目的依赖,避免不同项目之间的库版本冲突。以下是如何创建和使用虚拟环境的详细步骤。

Python 3.3 及以上版本自带 venv 模块,可以直接使用。

使用 venv 创建虚拟环境

创建虚拟环境

在你的项目目录下,运行以下命令来创建一个虚拟环境,这将在项目目录下创建一个名为 myenv 的文件夹,其中包含虚拟环境的所有文件:

python -m venv myenv

激活虚拟环境

Windows:

myenv\Scripts\activate

macOS 和 Linux:

source myenv/bin/activate

安装依赖

在虚拟环境中,你可以使用 pip 来安装项目所需的库:

pip install requests

安装的库将只会影响当前虚拟环境,而不会影响系统的 Python 环境或其他项目。

冻结依赖

为了确保你的项目依赖可以在其他环境中重现,你可以使用以下命令将当前环境的依赖写入 requirements.txt 文件:

pip freeze > requirements.txt

requirements.txt 文件将包含所有当前环境中的安装包及其版本信息。

使用 requirements.txt 安装依赖

在新的环境中,你可以使用 requirements.txt 文件来安装所需的所有依赖:

pip install -r requirements.txt

退出虚拟环境

当你完成工作时,可以通过以下命令退出虚拟环境:

deactivate

使用虚拟环境进行Python开发可以有效地隔离项目依赖,避免版本冲突。通过创建和激活虚拟环境、安装依赖、冻结依赖并在新环境中重新安装依赖,可以确保你的项目在不同环境中具有一致的运行表现。

]]>
<![CDATA[从源码编译安装 python]]> https://blog.niekun.net/archives/1758.html 2020-09-21T16:35:00+08:00 2020-09-21T16:35:00+08:00 admin https://niekun.net 从源码编译程序的好处是可以使用最新版本,下面介绍如何在 Linux 下编译安装 python 和 pip 环境。

下载源码包

python 官网:https://www.python.org/

当前最新版是 3.8.5,在这个页面找到地址:https://www.python.org/downloads/release/python-385/

1.jpg

下载 tgz 压缩包到本地并解压:

cd /tmp
wget https://www.python.org/ftp/python/3.8.5/Python-3.8.5.tgz
tar xvf Python-3.8.5.tgz

环境安装

编译需要安装一些依赖:

apt install libffi-dev libgdbm-dev libsqlite3-dev libssl-dev zlib1g-dev

编译

python 源码使用标准 GNU 编译系统,详细说明参考:https://blog.niekun.net/archives/883.html

将 python 安装到 /opt 目录,先创建文件夹:

mkdir /opt/python3.8.5

然后配置 configure:

cd /tmp/Python-3.8.5

./configure \
--prefix=/opt/python3.8.5 \
--enable-optimizations \

没有错误提示的话就开始编译和安装:

make
make install

安装完成后测试执行:

/opt/python3.8.5/bin/python3 --version

返回版本信息则安装完成。

下面将可执行文件加入系统路径,创建软连接:

ln -s /opt/python3.8.5/bin/python3 /usr/bin/python

测试运行:

python --version

安装 pip

源码编译安装的 python 不自带 pip,需要自己安装,可以使用 get-pip.py 脚本来安装。

官网:https://pip.pypa.io/en/stable/installing/

下载脚本到本地:

curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py

使用刚才安装的 python 执行脚本:

/opt/python3.8.5/bin/python3 get-pip.py

pip 的安装路径是 /opt/python3.8.5/bin/,测试命令:

/opt/python3.8.5/bin/pip3 --version

返回版本信息则安装完成。

添加软连接到系统路径:

ln -s /opt/python3.8.5/bin/pip3 /usr/bin/pip

测试命令:

pip --version

参考链接

https://docs.rstudio.com/resources/install-python-source/

]]>
<![CDATA[使用 subprocess.check_output 执行cmd命令并返回结果到字符串]]> https://blog.niekun.net/archives/1753.html 2020-09-18T15:13:51+08:00 2020-09-18T15:13:51+08:00 admin https://niekun.net 语法:

subprocess.check_output(args, *, stdin=None, stderr=None, shell=False, universal_newlines=False)

执行cmd命令并返回结果到字符串。

用法:

import subprocess

output = check_output(["cat", "/etc/hostname"]).strip()
print(output)

以上脚本会执行 cat /etc/hostname 命令然后将结果赋值给 output 变量。
strip() 可以将 string 的前后空格去掉。

]]>
<![CDATA[argparse and struct in python]]> https://blog.niekun.net/archives/1718.html 2020-08-14T11:20:39+08:00 2020-08-14T11:20:39+08:00 admin https://niekun.net https://docs.python.org/3/library/argparse.html
https://docs.python.org/3/library/struct.html

]]>
<![CDATA[string <-> byte in python]]> https://blog.niekun.net/archives/1688.html 2020-08-12T14:08:00+08:00 2020-08-12T14:08:00+08:00 admin https://niekun.net To transform a unicode string to a byte string in Python do this:

>>> 'foo'.encode('utf_8')
b'foo'

To transform a byte string to a unicode string:

>>> b'foo'.decode('utf_8')
'foo'

  1. To convert a string to bytes.

    data = ""               #string
    data = "".encode()      #bytes
    data = b""              #bytes
  2. To convert bytes to a String.

    data = b""              #bytes
    data = b"".decode()     #string
    data = str(b"")         #string
]]>
<![CDATA[winreg 操作 Windows 注册表 in python]]> https://blog.niekun.net/archives/1685.html 2020-08-12T13:56:00+08:00 2020-08-12T13:56:00+08:00 admin https://niekun.net https://docs.python.org/3/library/winreg.html#
https://stackoverflow.com/questions/15128225/python-script-to-read-and-write-a-path-to-registry

import winreg

REG_PATH = r"Control Panel\Mouse"

def set_reg(name, value):
    try:
        winreg.CreateKey(winreg.HKEY_CURRENT_USER, REG_PATH)
        registry_key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, REG_PATH, 0, 
                                       winreg.KEY_WRITE)
        winreg.SetValueEx(registry_key, name, 0, winreg.REG_SZ, value)
        winreg.CloseKey(registry_key)
        return True
    except WindowsError:
        return False

def get_reg(name):
    try:
        registry_key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, REG_PATH, 0,
                                       winreg.KEY_READ)
        value, regtype = winreg.QueryValueEx(registry_key, name)
        winreg.CloseKey(registry_key)
        return value
    except WindowsError:
        return None

#Example MouseSensitivity
#Read value 
print (get_reg('MouseSensitivity'))

#Set Value 1/20 (will just write the value to reg, the changed mouse val requires a win re-log to apply*)
set_reg('MouseSensitivity', str(10))

#*For instant apply of SystemParameters like the mouse speed on-write, you can use win32gui/SPI
#http://docs.activestate.com/activepython/3.4/pywin32/win32gui__SystemParametersInfo_meth.html
]]>
<![CDATA[使用 opencv 处理图像]]> https://blog.niekun.net/archives/1684.html 2020-08-07T11:37:51+08:00 2020-08-07T11:37:51+08:00 admin https://niekun.net 安装:https://pypi.org/project/opencv-python/
使用:https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_setup/py_table_of_contents_setup/py_table_of_contents_setup.html
示例:https://www.askaswiss.com/2016/01/how-to-create-pencil-sketch-opencv-python.html
打包 exe:https://pypi.org/project/auto-py-to-exe/

]]>
<![CDATA[使用 TelegramBot 键盘 InlineKeyboardButton 提示 BUTTON_DATA_INVALID 报错原因分析]]> https://blog.niekun.net/archives/880.html 2020-02-01T18:06:06+08:00 2020-02-01T18:06:06+08:00 admin https://niekun.net 今天在测试 telegram Bot 的时候,发现 keyboard 不能正确弹出来,后台查看发现报错了,提示 Bad Request: BUTTON_DATA_INVALID

反复检查代码没有发现语法错误,查找之后了解到 InlineKeyboardButton 响应后返回的 Callback Data 有大小限制,最大64位:

2020-02-01T10:02:48.png

的确我想返回的内容长度的确超过了大小限制,优化源码后问题解决了。

参考链接:
https://core.telegram.org/bots/api#inlinekeyboardbutton
https://stackoverflow.com/questions/46389040/inlinekeyboardbutton-are-limited-in-inlinekeyboardmarkup-telegram-bot-c-sharp

]]>
<![CDATA[python 常用语法收集]]> https://blog.niekun.net/archives/438.html 2019-10-17T14:52:00+08:00 2019-10-17T14:52:00+08:00 admin https://niekun.net 在我使用过程中遇到的常用语法,这里做一些记录。

os.system()

可以用来运行终端命令:

import os
os.system('date')
-----------------------
The current date is: 10/17/2019 Thu 

glob

用来将匹配的文件放入数组:

import glob
import os
CWD = os.getcwd()#当前目录路径
for name in glob.glob(CWD+'/*'):
    print(name)

以上输出当前目录下所有文件的文件名。

for name in glob.glob(CWD+'/file?.txt'):
    print(name)

以上输出 filea.txt, fileb.txt filec.txt 等文件名。

可以使用类似正则表达式的方式匹配文件名:

glob.glob(CWD+'/*[12].*')

从python3.5开始,支持使用一下方法进行递归搜索目录内文件及文件夹:

for name in glob.glob(CWD+'/**/*', recursive=True):
    print(name)

以上会输出目录内文件及子文件夹内文件。

split()

字符串分割:

按空格分割,注意两个部分之间的空格可以是1个或多个,不影响分割效果:

txt = "welcome to the jungle"
x = txt.split()

将 txt 字符串按空格来分成4个部分,x 是数组。

分割成设定的个数:

txt = "welcome to the jungle"
x = txt.split(' ', 1)

输出结果:x = ['welcome', 'to the jungle']

按特定字符分割:

txt = "apple#banana#cherry#orange"
x = txt.split("#", 1)

输出结果:x = ['apple', 'banana#cherry#orange']

next()

用于 iterator 的顺序提取。

mylist = iter(["apple", "banana", "cherry"])
x = next(mylist)
print(x)
y = next(mylist)
print(x)
z = next(mylist)
print(x)

输出结果:x = 'apple' y = 'banana' z = 'cherry'

format()

用于字符串内的赋值:

print ("{}, A computer science portal for geeks".format("GeeksforGeeks"))

输出:GeeksforGeeks, A computer science portal for geeks

多个输入参数:

print ("Hi ! My name is {} and I am {} years old"
                            .format("User", 19)) 

带索引的多参数输入:

print("Every {3} should know the use of {2} {1} programming and {0}"
        .format("programmer", "Open", "Source", "Operating Systems")) 

输出结果:Every Operating Systems should know the use of Source Open programming and programmer

strip()

删除字符串前和后的空格:

txt = "     banana     "
x = txt.strip()

输出:x = 'banana'

删除字符串前和后的自定义字符:

txt = ",,,,,rrttgg.....banana....rrr"
x = txt.strip(",.grt")

输出: x = 'banana'

]]>
<![CDATA[使用 telegram bot 做一个视频下载器]]> https://blog.niekun.net/archives/428.html 2019-10-16T15:56:00+08:00 2019-10-16T15:56:00+08:00 admin https://niekun.net 需要环境:
Linux
python3
python-telegram-bot
yt-dlp
instaloader

python

我是用的是 python3.8,使用系统包管理器安装:

apt install python3

如果系统内安装了多个版本的 python,修改 /usr/bin/python 的默认链接,具体修改方法查看此教程:
https://niekun.net/index.php/archives/413.html

python-telegram-bot

安装或升级:

 pip install python-telegram-bot --upgrade

yt-dlp 安装

原来的 youtube-dl 最近好久不更新了,发现下载速度极慢,最近切换到 yt-dlp 效果很好。

GitHub:https://github.com/yt-dlp/yt-dlp

pip 方式安装及更新:

python3 -m pip install -U yt-dlp

instaloader 安装

instaloader 可以下载 Instagram 的图片或视频。

GitHub 主页:https://github.com/instaloader/instaloader

instaloader 需要 python 3.5 以上。推荐直接安装最新版 python。

使用 pip3 安装:

pip3 install instaloader --upgrade

telegram bot

首先在 telegram 客户端内添加 BotFather

Creating a new bot
Use the /newbot command to create a new bot. The BotFather will ask you for a name and username, then generate an authorization token for your new bot.

The name of your bot is displayed in contact details and elsewhere.

The Username is a short name, to be used in mentions and telegram.me links. Usernames are 5-32 characters long and are case insensitive, but may only include Latin characters, numbers, and underscores. Your bot's username must end in ‘bot’, e.g. ‘tetris_bot’ or ‘TetrisBot’.

The token is a string along the lines of 110201543:AAHdqTcvCH1vGWJxfSeofSAs0K5PALDsaw that is required to authorize the bot and send requests to the Bot API. Keep your token secure and store it safely, it can be used by anyone to control your bot.

Generating an authorization token
If your existing token is compromised or you lost it for some reason, use the /token command to generate a new one.

bot 源码

我的开源地址:https://github.com/nie11kun/telegram-bot-youtube-downloader

使用脚本需要配置两个环境变量:BOT_TOKEN, INS_ACCOUNT。分别是 bot token 和你的 Instagram 用户名。

开机自动运行脚本

较新的 Linux 发行版可以使用 systemd 来实现自动启动,参考:https://blog.niekun.net/archives/1334.html

以下是 telegrambot-downloader.service unit 内容:

[Unit]
Description=telegrambot to download media Service
After=network.target nss-lookup.target

[Service]
User=root
EnvironmentFile=/etc/env_addon
ExecStart=/usr/bin/python /home/script/telegram-bot-youtube-downloader/main.py
Restart=on-failure

[Install]
WantedBy=multi-user.target

其中 EnvironmentFile 指向了自定义的环境变量文件地址,文件内容如下:

BOT_TOKEN=xxxxxxxxxxxxxx
INS_ACCOUNT=xxxxxx

可能运行报错问题及解决

执行脚本后,出现类似如下错误:

from tornado.httpserver import HTTPServer from tornado.httpserver import HTTPServer 
syntaxError: invalid syntax

可能是 tornado 版本过高,需要进行降级:

pip install tornado==4.5.3
]]>