之前的研究:
我在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);
mypy.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脚本的用户)
答案 0 :(得分:3)
int
在python2中没有方法.from_bytes
,/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);
答案 1 :(得分:0)
很抱歉以前的编辑,我误解了这个问题。您确定cli中的python
和/usr/bin/python
解析为相同的二进制文件吗?我看到的行为告诉我PHP正在尝试使用Python 2.x(因为int
对象没有方法from_bytes
)。