脚本导致python通过命令行运行时不会发生

时间:2015-03-24 00:13:17

标签: php python

之前的研究:

我在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脚本的用户)

2 个答案:

答案 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)。