核心
所有 Python 的内置函数均作为 PyCore 类的静态方法,内置方法的使用参考 Python 文档。
导入包
$os = PyCore::import('os');
成功后返回一个 PyModule 对象。可以导入 Python 内置的包,也可以导入其他第三方的包,或者用户自定义的包。
只能加载模块,不支持 Python 的 from module import class 语法,可用下面的语法代替。
$module = PyCore::import($moduleName);$class = $m->$className;
Python 底层会缓存已加载过的模块,当第二次加载时会自动返回缓存中的模块,不会重复加载。因此在 PHP-FPM/Apache
等短生命周期环境下也可使用,不会有性能问题。
加载路径
可使用 PyCore::import('sys')->path->append() 将一些目录加入到加载路径列表中。
例如:/workspace/app/user.py 自定义的包,可以通过下面的步骤实现加载:
PyCore::import('sys')->path->append('/workspace')将/workspace添加到sys.path中PyCore::import('app.user')将自动搜索sys.path找到对应的app/user.py包并载入
内置方法
PyCore::import($module)导入模块PyCore::str()将对象转为字符串PyCore::repr()PyCore::type()获取对象的类型PyCore::locals()获取当前空间内容的所有局部变量PyCore::globals()获取所有全局变量PyCore::hash()获取 Hash 值PyCore::hasattr()检测对象是否存在某个属性PyCore::id()获取对象的内部编号PyCore::len()获取长度PyCore::dir()获取对象所有的属性、方法PyCore::int()构造一个整数PyCore::float()构造一个浮点数PyCore::fn()构造一个可调用函数PyCore::eval()执行Python代码PyCore::dict()构造一个字典对象PyCore::set()构造一个集合对象PyCore::range()构造一个范围序列PyCore::scalar()将PyObject对象转为PHP的标量类型,例如PyStr将转为PHP 字符串,Dict/Tuple/Set/List将转为Array
PyCore实现了__callStatic()魔术方法,对于PyCore静态方法调用会自动调用Python的builtins模块对应的方法 , 可参考 Built-in Functions 了解更多内置方法的使用
动态链接库问题
导入库是发生动态链接库错误,原因可能是 LD 路径错误导致,可设置环境变量指定 Python C 模块 动态库路径。
可使用
:分割设置多个路径
# 仅使用 anaconda3 base 环境export LD_LIBRARY_PATH=/opt/anaconda3/lib# 使用了特别的环境,名称为 cefexport LD_LIBRARY_PATH=/opt/anaconda3/envs/cef/lib:/opt/anaconda3/libphp plot.php
这种方式仅对当前的 bash 会话有效,不会影响全局。不要直接修改 /etc/ld.so.conf.d/*.conf 增加 /opt/anaconda3/lib,这可能会导致
libc 库冲突,可能会影响操作系统其他程序的正常运行。
大小写敏感
请注意 Python 中所有函数、方法、变量、属性等均命名全部为大小写敏感,调用时必须使用与Python大小写完全一致的名称。
例如:
def TestUser():pass
在 PHP 代码中必须使用 $module->TestUser() ,其他的方式如 $module->testUser() 、$module->testuser() 均是错误的写法。
