px普贤教程PuXian
普贤教程 › 参考手册

内建函数速查

按用途整理的内建函数。全部在本机 0.2.382 上实测可用;标注「编译轨」的只在 px build 的产物里可用。

输出与类型

函数说明示例
print(v)输出并换行print("hi")
type(v)返回类型名字符串type(1) → "int"
len(v)字符数 / 元素数 / 键数len("中文") → 2
str(v)转字符串str(3.0) → "3.0"
int(v)转整数(严格解析,截断小数)int("42")、int(3.9) → 3
float(v)转浮点float("1.25")

字符串

函数说明
split(s, sep)按分隔符拆成列表
join(sep, list)拼成字符串(分隔符在前)
replace(s, old, new)替换全部
trim(s)去首尾空白
to_upper(s) / to_lower(s)大小写(不是 upper/lower)
contains(s, sub)是否包含
s.find(sub)首次出现下标,找不到 -1

列表与字典

写法说明
sorted(list)返回新列表,不改原列表
xs.append(v)末尾追加
xs.pop()弹出末尾并返回
xs.index(v)值所在下标
xs.remove(v)删除值(返回真值表示删了)
xs.sort()原地排序
contains(xs, v)列表是否包含某值
d.keys() / d.values()键 / 值列表
d.has(k)键是否存在(缺键直接取值会报 R1008)
d.remove(k)删除键

数学

函数说明
abs(n)绝对值
min(a, b) / min(list)最小值
max(a, b) / max(list)最大值
round(x)四舍五入,返回 float
floor(x) / ceil(x)向下 / 向上取整,返回 float
range(a, b[, step])整数序列,终点不含

时间

函数说明
now_sec() / now_ms()秒 / 毫秒时间戳
now()本地时间字符串
time_format(sec, fmt)格式化(UTC)

文件与系统

函数说明
read_file(path)读文本(二进制含 NUL 会截断)
read_file_opt(path)读文件,失败返回 Err
write_file(path, text)覆盖写入
append_file(path, text)追加
write_bytes(path, b)写二进制
exists(path)是否存在
open(path, mode) / close(fd)打开 / 关闭
read(fd, n)读 n 字节,返回 bytes
write(fd, data)写入
chmod(path, mode)改权限
env(k)环境变量,不存在返回 null
args()命令行参数,第 0 项是脚本名
hostname()主机名
exit(code)立即退出
sleep(ms)睡眠,单位毫秒

JSON

函数说明
json_stringify(v)紧凑输出
json_parse_opt(s)解析,失败返回 Err(推荐)
json_parse(s)解析,失败直接终止进程(慎用)

字节与编码

函数说明
bytes(s) / bytes_to_str(b)字符串 ↔ 字节
bytes_len(b) / bytes_get(b, i)字节长度 / 取某字节
bytes_set(b, i, v)返回新字节串(不可变)
base64_encode(s) / base64_decode(s)Base64 编解码
int_to_hex(n, width) / hex_to_int(s)十六进制转换
sha256(s) / sha1(s)摘要(十六进制字符串)
random_int(n)0 ≤ x < n 的随机整数

网络

函数说明
http_get(url)返回响应体字符串
http_request(url, method, body[, headers])返回 {status, headers, body}
tls_connect(host, port, opts)TLS 连接(写 SMTP 之类的协议用)

并发(仅编译轨)

原语说明
spawn f(args)启动并发执行单元
chan [T](n)带类型与缓冲的通道
ch.send (v) / ch.recv ()发送 / 接收(括号前有空格)
找不到某个函数时先 grep -r "^def " /usr/share/puxian/stdlib/ 看标准库;再看 registry/ 下对应包。注意:本页只收录常用的一批,不是全集(见下一节)。

内建到底有多少

0.2.382 注册的内建全局函数共 404 个(不含 __ 前缀的内部名)。本页按用途列的是最常用的几十个,不是全集。完整名单可以直接从运行时源码导出(RPM 自带 runtime/*.c):

sh
grep -ohE 'px_set_global\("[a-zA-Z_][a-zA-Z0-9_]*"' /usr/share/puxian/runtime/*.c \
  | sed 's/px_set_global("//; s/"//' | grep -v '^__' | sort -u > /tmp/px-builtins.txt
wc -l < /tmp/px-builtins.txt      # 404

怀疑某个函数有没有时,先查这张表——不要凭记忆,也不要因为本页没写就断定不存在。

进程与外部命令

os_exec 是 execve,不是「跑个子进程」它用新程序替换当前进程:调用之后本进程的代码不再执行,进程退出码就是被替换程序的退出码。第一次踩会表现为「打印完子进程输出,程序就静默结束了」。
px
def main():
    print("before")
    os_exec("sh", ["-c", "exit 7"])
    print("after")      # 永远不执行
text
before
(进程直接退出,rc=7)

要抓子进程输出用 os_capture,返回 {rc, stdout, stderr},支持 timeout_ms(超时 rc=137)与 cwd:

px
var r = os_capture("sh", ["-c", "echo out; echo err >&2; exit 3"])
print(str(r["rc"]))     # 3
print(r["stdout"])      # out
print(r["stderr"])      # err

var t = os_capture("sh", ["-c", "sleep 5"], {"timeout_ms": 300})
print(str(t["rc"]))     # 137(超时被杀)
text
3
out

err

137

进程族一共 14 个:os_exec os_spawn os_spawn_capture os_capture os_popen os_wait os_kill os_pid os_self_path os_errno os_rename os_remove_all os_file_sha256 os_random_hex。要并发跑多个子进程用 os_spawn 拿 pid,再 os_wait(pid) 收尸。

HTTP 服务端

语言自带 HTTP 服务端,不需要额外框架:

px
def handler(req):
    return {"status": 200, "headers": {"Content-Type": "text/plain"}, "body": "hi " + req["path"]}

def main():
    http_serve(8080, handler)
text
$ curl -s http://127.0.0.1:8080/abc
hi /abc

相关名字:http_serve http_serve_unix px_serve(静态文件)vhost route middleware basic_auth sse_serve tcp_listen udp_serve tls_server。

WebSocket

服务端 ws_serve(port, handler);客户端 ws_connect(url)。收发与心跳:ws_send ws_recv ws_broadcast ws_ping ws_heartbeat ws_close;连接信息 ws_conn_peer ws_conn_path ws_conn_header;流式与握手 ws_stream ws_reply_101 ws_connect_auto。

SQLite

px
var db = sqlite_open("/tmp/t.db")
sqlite_exec(db, "create table if not exists t(a int)")
sqlite_exec(db, "insert into t values(?)", [1])
var rows = sqlite_query(db, "select * from t")
print(str(rows))
sqlite_close(db)

六个函数:sqlite_open sqlite_exec sqlite_query sqlite_escape sqlite_last_insert_rowid sqlite_close。注意 --min 会把 sqlite 裁掉(见工具链那章)。

对象存储 / 网络 / 图像 / HTTP/3

族名字
对象存储(4)s3_get s3_put s3_list s3_delete
DNS / TCP / UDP / TLSdns_lookup dns_txt;tcp_listen tcp_connect 等 10 个;udp_serve udp_send 等 5 个;tls_connect tls_server 等 6 个
QUIC(27)quic_listen quic_accept quic_connect quic_open_stream quic_send quic_recv quic_migrate quic_h3_listen …
HTTP/3(38)h3_server_listen h3_serve_read_request h3_serve_send_response h3_client_connect h3_client_send_request h3_qs_open …
图像img_decode img_encode_jpeg img_scale
会话 / 定时 / 事件session_get session_set …;cron set_timeout set_interval;event_bus bus_publish bus_subscribe
系统 / 推理 / 扩展mmap flock sandbox_enter ffi_call;onnx_model_open onnx_run
哪些要编译轨http_serve / ws_* / sqlite_* / s3_* 在解释轨也能跑,但服务器类程序一律用 px build 出二进制再跑:解释轨的循环开销是编译轨的几百倍(见性能那章)。