【问题标题】:Script causes errors that don't happen when python run via command line脚本导致python通过命令行运行时不会发生的错误
【发布时间】:2015-05-27 04:22:40
【问题描述】:

以前的研究:

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

【问题讨论】:

  • int 没有方法.from_bytes,该代码不会在任何使用python2的地方运行,很确定你需要/usr/bin/python3
  • 我刚试过你的测试用例。我遇到了与直接运行 .py 脚本时相同的错误。我正在运行 2.7。看起来int.from_bytes >= 3.2?

标签: php python


【解决方案1】:

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

【讨论】:

  • 问题是我设置了一个从/usr/local/bin/python3/usr/bin/python 的bash 别名。因此,确实,当使用一个版本的 python 运行时会出现错误,而使用另一个版本运行时则不会出现错误。感谢您将正确的 python 环境放在文件顶部的解决方案。
【解决方案2】:

抱歉之前的编辑,我误读了这个问题。您确定 cli 中的 python/usr/bin/python 解析为相同的二进制文件吗?我看到的行为告诉我 PHP 正在尝试使用 Python 2.x(因为 int 对象没有方法 from_bytes)。

【讨论】:

  • 感谢您的回答,您确实找到了我问题的根源。我投了赞成票,但由于帕德莱克的答案更全面,我认为我应该选择他作为正确答案。
  • @StephenM347,这应该只是一个评论,但我还不能发布它们。谢谢。
猜你喜欢
  • 1970-01-01
  • 2017-09-13
  • 1970-01-01
  • 2021-03-20
  • 2017-07-20
  • 2014-05-11
  • 2021-07-17
  • 1970-01-01
  • 2021-02-01
相关资源
最近更新 更多