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

常见问题

十五个最常被问到的问题。答案都在前面的章节里有详细展开,这里给最短路径。

入门

1. PuXian 和 Python 语法像吗?

像在缩进、def、if/elif/else、列表字典的写法;不同在没有异常、没有类、字符串拼接要显式 str()、除法返回浮点但位运算只吃整数。

2. 为什么我的 main 跑了两遍?

因为文件末尾多写了一行 main()。语言会自动调用 def main(),删掉那行即可。

3. 要不要装虚拟环境 / 配 PATH?

不需要。解释器就是 px,依赖是文件。唯一要注意的是在解压目录外跑时设 PX_STDLIB 指向 stdlib/。

语法与类型

4. 为什么会报「期望变量名,实际得到 from」?

from 和 in 是保留字。改成 sender / item 之类。

5. 有没有三元表达式?

没有。a if c else b 和 c ? a : b 都不支持。先算好变量再用。

6. 为什么 2 ** 64 得到 0?

整数是 64 位有符号,溢出按位回绕,不报错。需要大数用生态包 big。

7. 为什么 "x" + 1 报错,Python 却不报?

语言不做隐式转换。所有拼接前显式 str()。好处是输出永远不会意外变成 x1。

8. 函数里改了全局变量,为什么外面也变了?

规则是:用 var 声明 = 局部变量;直接赋值 = 改已存在的外层变量。不想改外层就加 var。

运行与工具

9. px run 和 px build 差多少?

一个 10 万次的循环:解释 5.2–5.9 秒,编译后 10–12 毫秒。约 500 倍。生产一律用编译产物。

10. px run --fast 报「找不到模块 E3005」怎么办?

import 写错了。0.2.379 起 --fast 能解析 import,且是严格模式:import "strings.px" 这种写法会直接失败,正确写法是 import std.strings(点分、不带引号);本地文件才用带引号的相对路径。同一脚本用 px run(解释轨)可能只打警告照常跑,所以以 --fast 的报错为准。

11. 报错里 1:11 是什么意思?

第 1 行第 11 列。列号很重要,别只看行号。

12. 段错误(Segmentation fault)是怎么回事?

最常见的原因是自定义函数与内建同名(例如 def env(...)),函数体里再调 env() 就成了无限递归。改个名即可。

部署与接口

13. 写 Web 接口要自己起服务吗?

不用。把 .px 交给 Ma 的 px_routes,脚本读环境变量与 /dev/stdin,往 /dev/stdout 写 Status: + 头 + 空行 + 体。

14. 为什么接口返回的内容前面多了一行日志?

因为用了 print 打日志——在 px_routes 里 print 写的就是响应体。日志改走 /dev/stderr。

15. 部署到 Ma 后报「未定义变量」,本地却正常?

脚本里跨目录 import 了(import "../lib/x.px")。Ma 编译只打包脚本所在目录,跨目录目标不存在。把公共库复制进本目录,用同目录相对路径。

还有问题?

想做的事去哪看
某个函数怎么用内建函数速查;或直接看 /usr/share/puxian/stdlib/*.px 源码
报错看不懂错误码速查
要找特定能力的包标准库概览 与 registry
写接口写一个 Web 接口
性能不行性能与陷阱
一句话建议遇到"语法看着对但不跑",先 px lint;遇到"跑起来报未定义",先查 import;遇到"线上慢十倍",先确认是不是解释轨。