
otree入门常见问题
学弟/学妹,别慌!刚接触oTree的时候,大家问的问题都差不多。我把你这些问题,用咱们学生之间聊天的方式,整理了一下。这感觉就像你在宿舍楼下,碰到了一个刚做完实验的学长,他告诉你的一些“血泪经验”。
1. 救命!oTree这玩意儿到底怎么装?官方文档第一步就劝退了…
这绝对是第一道坎,90%的人都在这卡过。官方文档是给有经验的程序员看的。
我的建议:
-
第一步: 别管官方文档,直接跟着我的教程来安装 https://otree.xindamate.xyz/?p=99
-
常见巨坑: 如果报错
otree_startup_failed
。99%的可能是Python环境问题。记住一条咒语:“为oTree创建一个独立的虚拟环境 (virtual environment)”。把oTree相关的包都装在这个“隔离区”里,就不会和你电脑上其他Python项目打架了。 -
Python水平? 你会
if/else
就够了。oTree编程更像是“填空题”,而不是“写作文”。大部分时候,你都是在改官方给的模板。
2. 老师让我做个“最后通牒博弈”,我一个字都写不出来… 有没有模板给我抄…啊不,参考一下?
哈哈哈,我懂!没人一上来就会自己写。你的“宝藏库”有两个:
-
oTree官方的
Public Projects
: https://www.otreehub.com/projects/ 里面有现成的囚徒困境、公共品博弈等。 -
GitHub: 去GitHub搜
oTree ultimatum game
https://github.com/search?q=oTree%20ultimatum%20game&type=repositories,你能找到全世界各路大神写的版本。
高效“参考”方法:
-
把你看中的项目代码下载下来。
-
用
otree zipserver [你下载的压缩包文件名.zip]
这个命令,把它在你电脑上跑起来。 -
关键一步: 把你的项目窗口和范例项目的窗口并排放在屏幕上,对着看!看它的
models.py
是怎么定义变量的,pages.py
是怎么写页面逻辑的。先模仿,再理解,最后才是创新。
3. 我怎么知道代码有没有bug?总不能直接找同学来测,万一崩了多尴尬…
信我,直接找真人测,一定会崩,特别尴尬(别问我怎么知道的)。
你必须用oTree的 Bots (机器人) 功能。它不是简单帮你点“下一页”,而是你代码的“压力测试员”。
-
具体场景: 比如你做公共品博弈,要求玩家投入0-10个币。你可以在机器人的脚本里故意让它提交一个
-5
或者100
。如果你的代码没做限制,机器人就会在这里报错。这时候你就知道,得在Player
的contribution
字段里加上min=0, max=10
这个参数了。 -
Pro Tip: 在测试阶段,把
SESSION_CONFIGS
里的num_demo_participants
改成你实验的人数,比如20人。然后点一下Start bots
,它就能瞬间模拟20个人跑完你的实验,什么奇奇怪怪的bug都能帮你炸出来。
4. session, app, page, round 这些词到底啥意思啊?我被绕晕了。
忘掉官方定义,把它想象成一个闯关游戏:
-
Session
(一场实验): 你和你的小伙伴们 “开始玩这整个游戏”。比如“周三下午三点场”。 -
App
(一个大关卡): 游戏里有好几个大关卡。比如第一关是“新手教程”(填个人信息),第二关是“Boss战”(主实验博弈),第三关是“领取奖励”(问卷调查)。 -
Round
(关卡里的重复挑战): 你的“Boss战”可能要打好几轮。每一轮都是一个Round
。 -
Page
(关卡里的每个房间): 每一关里,你都要经过好几个房间。比如“游戏说明”房间、“做出选择”房间、“看结果”房间。每个房间就是一张Page
。
记住这个顺序:Session > App > Round > Page。这么一想,结构就清晰了。
5. 我改了代码,刷新页面怎么没反应?
这是个超级常见,但文档里几乎不提的坑!
oTree为了性能,会缓存很多东西。你改了Python代码(比如 models.py
或 pages.py
),简单地刷新网页是没用的!
正确做法: 回到你的命令行/终端,按 Ctrl+C
停止oTree服务器,然后按“向上”方向键,找到你上次输入的 otree devserver
命令,回车,重启服务器。每次修改 .py
文件后,都要这么做。修改HTML模板文件通常不需要重启。
6. 我做好了想发给别人填,怎么放到网上?是不是得租服务器,很贵吧?
对于学生的小规模实验,用 Heroku 是标准答案。
-
价格: 别被“服务器”吓到。Heroku的基础方案一个月7-10美元,大概就是两杯奶茶钱,就能撑起你几十上百人的小实验了。
-
关键文件: 第一次部署到Heroku,大概率会失败。失败原因通常是少了几个关键的配置文件。检查你的项目根目录里有没有这三个文件:
Procfile
,requirements_base.txt
,runtime.txt
。oTree官方文档有教你怎么生成它们,照着做就行。 -
HTTPS/数据库: Heroku默认就给你搞定了HTTPS安全链接,添加数据库也是点几下鼠标,非常方便。
7. 实验做完了,怎么把数据导出来啊?
这个问题的频率绝对是Top 3!
实验顺利跑完,恭喜!现在是收获的时候了:
-
用管理员身份登录你的oTree实验后台。
-
顶部导航栏有一个“Data”选项卡。
-
点进去,你会看到所有Session的数据。你可以选择导出“all_apps_wide”这个CSV文件,它会把一个被试所有的数据都放在同一行里,这是最常用的格式,方便用Stata或Excel分析。
-
旁边还有一个“Page times”的CSV,可以导出每个被试在每个页面停留了多久,有时候可以用来判断他是不是在划水。
8. 在主实验前面加一个同意书,最后加一个问卷,怎么实现?
这个思路非常对,就是把它们做成独立的app。
-
在你的项目里,创建三个app,比如
app1_consent
(同意书),app2_main_game
(主实验),app3_survey
(问卷)。 -
打开项目根目录的
settings.py
文件。 -
找到
SESSION_CONFIGS
这个设置。在你的实验配置里,有一个叫app_sequence
的列表。 -
把它的顺序改成
['app1_consent', 'app2_main_game', 'app3_survey']
。 -
重启服务器,搞定!oTree就会像播放列表一样,按顺序执行这几个app。
9. 实验里的“ECU”、“虚拟币”最后怎么算成真钱?
这是oTree的核心功能,比你想象的简单。
-
在
settings.py
里,定义好你的REAL_WORLD_CURRENCY_PER_POINT
,比如0.5
,代表1个虚拟币 = 0.5元。 -
在实验的每一轮,你把玩家挣的虚拟币存到一个叫
player.payoff
的特殊变量里。oTree会自动帮你累加每一轮的payoff
。 -
实验结束后,oTree会自动计算出
总虚拟币 * 兑换率
的金额。 -
关键: 别忘了实验还有 参与费 (participation fee)。你可以在
SESSION_CONFIGS
里设置它。最终被试看到的钱,是player.payoff
换算后的钱 + 参与费。oTree后台的支付页面会帮你把这两项加好,清清楚楚。
最后,给你的几句心里话:
-
学会看报错: 满屏红字很吓人,但永远只看最后一行。它会告诉你哪个文件的哪一行出错了。
-
多用
print()
: 不确定一个变量的值是什么?就在代码里print(self.player.my_variable)
,答案会直接显示在你的命令行窗口里。这是最简单粗暴但极其有效的调试方法。 -
耐心和Google是你的超能力: 你遇到的99%的问题,Google上都有人问过。把报错信息复制粘贴到Google,通常第一个结果就是oTree官方论坛或StackOverflow的答案。
加油!搞定oTree,不仅能让你的实验顺利完成,这个解决问题的过程本身,也会让你收获巨大。祝实验顺利,数据给力,早日发paper!