【问题标题】:"ImportError: No module named _SHA256" when using PHP's exec() to call python script使用 PHP 的 exec() 调用 python 脚本时出现“ImportError: No module named _SHA256”
【发布时间】:2012-07-31 22:11:12
【问题描述】:

我编写了一个python脚本“thescript.py”,它导入“SHA256.py”,它们都在同一个目录“/thedirectory/include/”中。

我在 PHP 中:

chdir('/thedirectory/include/');
$result = exec('thescript.py argument1 2>&1');

这给了我结果:

Traceback(最近一次调用最后一次):文件“thescript.py”, 第 4 行,在 ? 导入 SHA256 文件“/thedirectory/include/SHA256.py”,第 152 行,在? 导入 _SHA256 ImportError: 没有名为 _SHA25 的模块

导致此错误的 SHA256.py 行在这里:

try:
    import hashlib
    hashFactory = hashlib.sha256
except ImportError:
    #from Crypto.Hash import _SHA256
    import _SHA256  # <--- ERROR IS OCCURRING ON THIS LINE
    hashFactory = _SHA256

如果我通过 SSH 从命令行运行它,它运行良好。为什么不能导入_SHA256?

老实说,我不明白包名前的下划线在做什么。

“SHA256.py”中的import _SHA256 行是在导入自身还是什么?

【问题讨论】:

  • _SHA256 是一个真正的 python 模块吗?我在 google 中找不到任何关于它的信息,而且它不在我的 python 安装中。
  • 我刚刚发现问题在于当我从 PHP 执行 exec() 时,import hashlib 确实失败了。但是当我从 shell 运行脚本时发现了 hashlib。所以我想我需要以某种方式添加 hashlib 路径。
  • _SHA256 与 SHA256 不同,它是一个不同的模块。前导下划线具有内部/私有的含义,但除此之外,下划线只是另一个字符。这段代码的语义是“我们更喜欢使用 hashlib 模块中的实现,但如果在这个环境中不可用,我们可以回退到 _SHA256 模块。”在您的情况下,两者都不可用。

标签: php python import exec


【解决方案1】:

这是因为通过 exec 执行时路径可能不同。

在php中通过exec命令执行python时检查你的路径

import sys
sys.path

【讨论】:

    【解决方案2】:

    PHP 运行的 python 版本错误。

    实际上是 import hashlib 失败了,尽管我没有注意到这一点,因为它位于 try 块中,因此不会在该行引发错误。

    【讨论】:

      猜你喜欢
      • 2013-03-09
      • 1970-01-01
      • 2015-09-10
      • 2013-03-05
      • 1970-01-01
      • 1970-01-01
      • 2016-11-27
      • 2011-04-08
      • 2016-08-09
      相关资源
      最近更新 更多