问题描述
没法导入sys
而print的f-string也是无法导入的,导入报错,而f-string是从python3.6引入的。
所以ptrade内置的 python版本是低于3.6的,所以一些关键字async 也是无法使用的,
解决方案
根据Ptrade官方API文档以及您的实际测试现象,关于Ptrade的Python版本和模块导入限制,具体解答如下:
1. Ptrade使用的Python版本是多少?
根据Ptrade官方API文档(如get_history和get_price接口的返回说明),Ptrade底层实际上同时支持 Python 3.5 和 Python 3.11 两个版本。
但是,您当前所在的券商环境大概率部署的是 Python 3.5 版本。正如您所推测的:
- f-string 是在 Python 3.6 中引入的语法糖,因此在 Python 3.5 环境下会直接报语法错误。
- async/await 关键字虽然在 Python 3.5 中初步引入,但直到 3.6/3.7 才完善,且在 Ptrade 的同步事件驱动框架中通常不被支持或使用。
注:部分券商的Ptrade环境可能已经升级到了 Python 3.11,在 3.11 环境下是可以正常使用 f-string 的。您可以向所属券商确认是否可以切换或升级环境。
2. 为什么无法导入 sys 模块?
无法导入 sys 并非因为 Python 版本过低,而是因为 Ptrade 运行在严格的安全沙箱(Sandbox)环境中。
为了保证量化服务器的安全,防止恶意代码破坏系统环境或读取其他用户的数据,Ptrade 屏蔽了绝大多数与操作系统底层交互的内置模块,包括但不限于:
sys(系统特定参数和函数)os(操作系统接口,部分功能受限)subprocess(子进程管理)- 以及涉及本地高权限 IO 操作的模块。
官方文档在“关于持久化”一节中也明确提到:“涉及到IO(打开的文件,实例化的类对象等)的对象是不能被序列化的”,这侧面印证了其对底层资源的严格管控。
3. 替代方案与建议
既然在 Python 3.5 环境下无法使用 f-string,建议您在编写策略时使用以下传统的字符串格式化方法:
方案一:使用 % 格式化(Ptrade官方示例中最常用的方式)
stock = '600570.SS'
amount = 100
log.info("买入股票: %s, 数量: %d" % (stock, amount))
方案二:使用 .format() 方法
stock = '600570.SS'
amount = 100
log.info("买入股票: {}, 数量: {}".format(stock, amount))
总结:
在编写 Ptrade 策略时,建议默认以 Python 3.5 的语法标准来编写,避免使用 3.6+ 的新特性(如 f-string、海象运算符 := 等)。同时,遵循平台的沙箱规则,不要尝试调用 sys 等系统级模块,而是完全依赖 Ptrade 提供的 API(如 log.info() 替代 print,get_research_path() 获取路径等)来实现业务逻辑。