Skip to main content
 首页 » 编程设计

php之脚本导致的错误在 python 通过命令行运行时不会发生

2024年08月26日28insus

先前的研究:

我在 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);