過(guò)去三年中,我都會(huì)發(fā)布一下Python虛擬環(huán)境指南,今年的指南有點(diǎn)晚。如果是新的讀者朋友歡迎點(diǎn)開(kāi)下面鏈接,去查看往年的文章:
去年介紹的pipenv和poetry發(fā)展都還不錯(cuò),從github上看,感覺(jué)數(shù)據(jù)還在伯仲之間。在這兩者之外,新出了一個(gè)名叫 PDM(Python Development Master)
的虛擬環(huán)境工具。國(guó)人出品,3k的star,顏值和文檔都還不錯(cuò),今年就介紹它了。
PDM 介紹
mac 上直接使用 brew install pdm
安裝,其它系統(tǒng)官方提供了一個(gè)一鍵安裝的shell腳本。安裝完成后,創(chuàng)建一個(gè)項(xiàng)目目錄 test-pdm ,在目錄中使用 pdm init
命令初始化項(xiàng)目:
? test-pdm pdm init
Creating a pyproject.toml for PDM...
Please enter the Python interpreter to use
0. /usr/local/opt/python@3.9/bin/python3.9 (3.9)
1. /Library/Developer/CommandLineTools/usr/bin/python3 (3.8)
2. /Library/Frameworks/Python.framework/Versions/Current/bin/python3.8 (3.8)
3. /usr/local/bin/pypy3.7 (3.7)
4. /usr/local/bin/pypy (2.7)
5. /usr/local/Cellar/pdm/2.1.2/libexec/bin/python3.10 (3.10)
Please select (0): 2
Using Python interpreter: /Library/Frameworks/Python.framework/Versions/Current/bin/python3.8 (3.8)
Would you like to create a virtualenv with /Library/Frameworks/Python.framework/Versions/Current/bin/python3.8? [y/n] (y): y
Virtualenv is created successfully at /Users/yoo/tmp/test-pdm/.venv
Is the project a library that will be uploaded to PyPI [y/n] (n): n
License(SPDX name) (MIT):
Author name (game404):
Author email (studyoo@foxmail.com):
Python requires('*' to allow any) (>=3.8):
Changes are written to pyproject.toml.
pdm
比較方便的地方是會(huì)掃描出系統(tǒng)的python解釋器,提示用戶選擇解釋器版本, 比如上面日志顯示有5個(gè)python版本,有點(diǎn)亂:( 。初始化完成后,生成項(xiàng)目描述文件pyproject.toml
內(nèi)容如下:
[project]
name = ''
version = ''
description = ''
authors = [
{name = 'game404', email = 'studyoo@foxmail.com'},
]
dependencies = []
requires-python = '>=3.8'
license = {text = 'MIT'}
[build-system]
requires = ['pdm-pep517>=1.0.0']
build-backend = 'pdm.pep517.api'
當(dāng)然在項(xiàng)目目錄下,也會(huì)創(chuàng)建一個(gè)隱藏的 .venv 目錄,用來(lái)存放解釋器,和其它工具一致。
安裝包之前先使用 pdm config pypi.url https://pypi.tuna./simple
修改pypi的國(guó)內(nèi)源,然后使用 pdm add django
安裝包。修改源后,安裝包還是挺快的。查看項(xiàng)目的包,表格化展示:
pdm list
╭────────────────────┬─────────┬──────────╮
│ Package │ Version │ Location │
├────────────────────┼─────────┼──────────┤
│ asgiref │ 3.5.2 │ │
│ backports.zoneinfo │ 0.2.1 │ │
│ django │ 4.1 │ │
│ sqlparse │ 0.4.2 │ │
╰────────────────────┴─────────┴──────────╯
也可以使用下面命令導(dǎo)出標(biāo)準(zhǔn)配置 requirements.txt 文件和其它工具共享。
pdm export -o requirements.txt
另外發(fā)現(xiàn)一個(gè)pipx的工具,也有點(diǎn)意思,以后有時(shí)間了體驗(yàn)一下。近期go和rust使用比較多,順便也介紹一下這兩個(gè)語(yǔ)言的開(kāi)發(fā)環(huán)境。
go開(kāi)發(fā)環(huán)境
go開(kāi)發(fā)環(huán)境安裝
go在mac環(huán)境下的安裝沒(méi)什么好說(shuō)的,可以直接使用官方提供的安裝包安裝,這里介紹linux下的go環(huán)境安裝。
linux下需要下載對(duì)應(yīng)的版本,需要根據(jù)cpu架構(gòu)選擇,一般情況下選擇amd64架構(gòu)的,下載完成后解壓到 /usr/local 目錄即可:
curl -LO https://v/dl/go1.17.13.linux-amd64.tar.gz
tar -C /usr/local -xzf go1.19.linux-amd64.tar.gz
然后修改一下環(huán)境變量,增加go到系統(tǒng)path(修改后記得重新登錄一下):
# /etc/profile
export PATH=$PATH:/usr/local/go/bin
檢測(cè)go的版本:
# go version
go version go1.17.13 linux/amd64
# whereis go
go: /usr/local/go /usr/local/go/bin/go
go的開(kāi)發(fā)環(huán)境就設(shè)置完成了,非常簡(jiǎn)單, 已經(jīng)不再需要按照一些古老的文檔設(shè)置額外的環(huán)境變量。
go項(xiàng)目依賴
編寫一個(gè)測(cè)試類 main.go :
package main
import 'fmt'
func main() {
fmt.Println('Hello, World!')
}
運(yùn)行一下:
$ go run main.go
Hello, World!
go使用mod命令管理模塊,初始化項(xiàng)目 mod init example/hello
, 其中 example/hello
是我們的包名:
$ go mod init example/hello
go: creating new go.mod: module example/hello
go: to add module requirements and sums:
go mod tidy
完成后會(huì)形成 go.mod 文件:
module example/hello
go 1.17
對(duì)于項(xiàng)目,可以直接這樣運(yùn)行:
$ go run .
Hello, World!
依賴包的時(shí)候,可以直接在代碼中添加依賴:
...
import 'rsc.io/quote'
func main() {
fmt.Println(quote.Go())
...
}
然后使用mod tidy
自動(dòng)下載和配置依賴項(xiàng):
$ go mod tidy
go: finding module for package rsc.io/quote
go: downloading rsc.io/quote v1.5.2
go: found rsc.io/quote in rsc.io/quote v1.5.2
go: downloading rsc.io/sampler v1.3.0
go: downloading golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c
再次運(yùn)行項(xiàng)目,可以得到下面類似python之禪的輸出:
Don't communicate by sharing memory, share memory by communicating.
go版本升級(jí)
go在1.18版本開(kāi)始支持泛型,這是非常重要的一個(gè)特性,我們將剛安裝好的go升級(jí)到1.18版本。
升級(jí)過(guò)程和安裝類似,但是需要先清理掉舊的go版本:
$ rm -rf /usr/local/go
直接修改 main.go 添加一個(gè)泛型的實(shí)現(xiàn):
package main
import 'fmt'
import 'rsc.io/quote'
func say[T string | int](a T) {
fmt.Println(a)
}
func main() {
fmt.Println(quote.Go())
fmt.Println('Hello, World!')
say('hello')
say(2022)
}
- say 函數(shù)支持string和int兩種類型的參數(shù)
再次運(yùn)行項(xiàng)目:
$ go run .
Don't communicate by sharing memory, share memory by communicating.
Hello, World!
hello
2022
記得將 go.mod 中的go版本修改成1.18。
rust開(kāi)發(fā)環(huán)境
rust開(kāi)發(fā)環(huán)境安裝
rust官方文檔很詳盡,可以直接按照官方文檔執(zhí)行。安裝 Rust 的主要方式是通過(guò) Rustup 這一工具,它既是一個(gè) Rust 安裝器又是一個(gè)版本管理工具,可以使用下面一條命令完成安裝:
curl --proto '=https' --tlsv1.2 -sSf https://sh. | sh
完成后可以檢測(cè)一下rustup的版本:
? ~ rustup -V
rustup 1.25.1 (2022-07-12)
The Rust toolchain installer
還有rustc的版本:
? ~ rustc -V
rustc 1.62.1 (e092d0b6b 2022-07-16)
編寫下面的hello.rs
程序:
? rust cat hello.rs
fn main(){
println!('hello, rust');
}
rust是編譯程序,所以我們需要先編譯再運(yùn)行:
# 編譯
? rustc hello.rs
# 運(yùn)行
? ./hello
hello, rust
一般情況下我們不會(huì)直接使用rustc,這樣比較難以處理依賴,而是使用 Cargo
Rust 官方的構(gòu)建工具和包管理器。rustup默認(rèn)會(huì)按照cargo:
? cargo -V
cargo 1.62.1 (a748cf5a3 2022-06-08)
使用 cargo new start_rust
創(chuàng)建一個(gè)名為start_rust的項(xiàng)目,或者直接在當(dāng)前目錄使用 cargo init
, 項(xiàng)目目錄結(jié)構(gòu)如下:
? start_rust git:(master) ? tree -L 2
.
├── Cargo.lock
├── Cargo.toml
├── src
│ └── main.rs
可以看到和go的mod不一樣,cargo會(huì)創(chuàng)建src目錄,源碼都在這個(gè)目錄下。
Cargo.toml
文件描述了項(xiàng)目的信息及依賴,大概如下:
[package]
name = 'start_rust'
version = '0.1.0'
authors = ['game404 <studyoo@foxmail.com>']
edition = '2018'
# See more keys and their definitions at https://doc./cargo/reference/manifest.html
[dependencies]
...
完成main.rs文件中的main函數(shù),然后運(yùn)行:
? start_rust git:(master) ? cargo run
Compiling start_rust v0.1.0 (/Users/yoo/rust/start_rust)
Finished dev [unoptimized + debuginfo] target(s) in 0.73s
Running `target/debug/start_rust`
Hello, world!
使用cargo非常方便,一個(gè)命令即完成編譯和運(yùn)行兩個(gè)動(dòng)作。
rust項(xiàng)目依賴
可以使用 cargo add
指令添加項(xiàng)目依賴:
# cargo add ferris-says
Updating crates.io index
Adding ferris-says v0.2.1 to dependencies.
Features:
- clippy
添加完成后,我們可以在 Cargo.toml 文件中看到下面的內(nèi)容:
...
[dependencies]
ferris-says = '0.2.1'
...
也可以直接修改這個(gè)toml文件,使用 cargo build
指令時(shí)候會(huì)自動(dòng)安裝。
修改 main.rs 文件內(nèi)容:
use ferris_says::say; // from the previous step
use std::io::{stdout, BufWriter};
fn main() {
let stdout = stdout();
let message = String::from('Hello fellow Rustaceans!');
let width = message.chars().count();
let mut writer = BufWriter::new(stdout.lock());
say(message.as_bytes(), width, &mut writer).unwrap();
}
運(yùn)行項(xiàng)目:
# cargo run
Updating crates.io index
Downloaded smawk v0.3.1
Downloaded smallvec v0.4.5
Downloaded unicode-width v0.1.9
Downloaded textwrap v0.13.4
Downloaded ferris-says v0.2.1
Downloaded 5 crates (97.7 KB) in 0.33s
Compiling unicode-width v0.1.9
Compiling smawk v0.3.1
Compiling smallvec v0.4.5
Compiling textwrap v0.13.4
Compiling ferris-says v0.2.1
Compiling rust v0.1.0 (/root/rust)
Finished dev [unoptimized + debuginfo] target(s) in 2.34s
Running `target/debug/rust`
__________________________
< Hello fellow Rustaceans! >
--------------------------
\
\
_~^~^~_
\) / o o \ (/
'_ - _'
/ '-----' \
可以看到rust的吉祥物,一只叫做ferris的螃蟹。
rust版本升級(jí)
當(dāng)前rust最新版本是1.63.0
, 我們使用rustup將rust升級(jí)到最新版本。升級(jí)非常簡(jiǎn)單, 也只需要執(zhí)行一條命令:
rustup update
檢測(cè)一下升級(jí)結(jié)果:
? rustup -V
rustup 1.25.1 (2022-07-12)
info: This is the version for the rustup toolchain manager, not the rustc compiler.
info: The currently active `rustc` version is `rustc 1.63.0 (4b91a6ea7 2022-08-08)`
? rustc -V
rustc 1.63.0 (4b91a6ea7 2022-08-08)
? cargo -V
cargo 1.63.0 (fd9c4297c 2022-07-01)
今年各種事情導(dǎo)致斷更了比較久。拖更的原因很多,復(fù)更的原因卻只有一個(gè),“堅(jiān)持” 兩字而已。也歡迎大家回來(lái):)
參考鏈接
- https://www./zh-CN/learn/get-started
- https://github.com/pdm-project/pdm
- https:///2020/02-28/pdm-introduction/