先前的研究:
- Running a Python script from PHP
- error on using exec() to call python script
- Php exec python script 'weakness'/downside
- Using exec() to run python script in PHP
我在 OS X 上运行 php 5.6.6 版和 python 3.4.3 版。
基本上,我遇到的问题是,如果我通过命令行运行 python 脚本,它可以找到,但如果我通过 PHP 脚本运行它(使用 exec() ) 我收到此错误:
AttributeError: type object 'int' has no attribute 'from_bytes'
我已经创建并测试了一个微型隔离测试用例来说明问题。我已经执行了 chmod 777 mypy.py 以确保 mypy.py 可执行。
myphp.php:
<?php
exec("/usr/bin/python mypy.py 1A", $output, $return);
var_dump($output);
我的.py:
#!/usr/bin/env python
import string
import array
import binascii
import sys
if __name__ == "__main__":
hexval = sys.argv[1]
binval = binascii.unhexlify(hexval)
binint = int.from_bytes(binval, byteorder='big', signed=False)
print("int: " + str(binint))
(我知道有更好的方法可以完成这个 python 脚本中正在做的事情,我只是制作一个会产生相同错误的测试用例)
当我通过命令行运行 python mypy.py 1F 时,我得到了这个打印:
int: 31
但是当我通过命令行运行 php myphp.php 时,我打印了这个:
Traceback (most recent call last):
File "mypy.py", line 11, in <module>
binint = int.from_bytes(binval, byteorder='big', signed=False)
AttributeError: type object 'int' has no attribute 'from_bytes'
array(0) {
}
(注意:我还从 php 脚本中执行了 whoami,只是为了验证我的普通用户是运行 python 脚本的用户)
请您参考如下方法:
int has no method .from_bytes in python2,/usr/bin/python 使用python 2解释器,你需要使用/usr/bin/python3 使用你的 python3 解释器。
exec("/usr/bin/python3 mypy.py 1A", $output, $return);
使文件可执行也无关紧要,因为您明确地使用 python 运行它。
要将其作为可执行文件运行并使用 python3 解释器,请在 python shebang 中指定正确的 python 版本:
#!/usr/bin/env python3
然后:
exec("./mypy.py 1A", $output, $return);
