【问题标题】:Python 'No module named ...' when script is executed by php with shell_exec()当脚本由 php 使用 shell_exec() 执行时,Python 'No module named ...'
【发布时间】:2019-10-30 14:08:35
【问题描述】:

我编写了一个 python 脚本来导入我使用pip 安装的特定模块。

当我在 python test.py 这样的终端上运行此脚本时,一切正常,当我运行 help("modules") 时,我可以在列表中看到我的模块(所以他安装得很好)

问题是我尝试使用 shell_exec("python test.py") 使用 php 脚本运行此脚本,但随后出现 python 不知道此模块的错误:

ImportError: No module named ...

你知道我的错误是什么或者我可以如何解决这个问题吗?


>编辑1:

所以我像@LucasMeine 告诉我的那样成为了 apache 用户,首先我发现使用的 python 版本不正确。所以我创建了一个好的别名,然后我在终端中使用help("modules")检查了apache用户和模块存在的正确python版本。该模块在给定的列表中,所以我不明白为什么在我的 apache 错误日志中我收到消息:

ImportError: No module named ...

【问题讨论】:

  • 如果您正在使用环境,请先尝试发送命令以启用该环境
  • 对不起,我不太明白你的意思?
  • 尝试使用完整路径运行您的脚本,例如shell_exec("/usr/bin/python3.5 test.py")(放入您需要的路径)。这样,您将确保您运行所需的任何版本的 Python,并且不会依赖于您的 shell 设置。
  • @igrinis 谢谢它的作品。我应该先尝试一下。发表你的答案,这样我就可以给你我的赏金;)

标签: php python linux shell


【解决方案1】:

调用shell_exec("python test.py") 时,您依赖的shell 设置会将python 命令扩展为完全限定路径。显然,如果您的帐户设置之间存在差异,您可能会调用不同版本的 Python,并安装不同的模块。为了规避这种依赖,您可以尝试使用完整路径指定要运行的 Python 的确切版本,例如

shell_exec("/usr/bin/python3.5 test.py") 

要获取 Python 安装的路径,您可以在终端中运行 which python

作为另一种解决方案,您可以修复运行 Web 服务器的帐户的 shell 设置以匹配当前用户的设置。

干杯!

【讨论】:

    【解决方案2】:

    问题是,当您使用 shell_exec 时,apache 用户将运行该进程。并且 apache 用户无权访问您刚刚使用 pip 与普通用户一起安装的模块。

    所以你可以成为 apache 用户:

    su -s /bin/bash apache
    

    用 pip 安装你的东西,然后你的代码就可以工作了。还要记住,apache 用户可以有不同的名称,具体取决于您的 linux 发行版。

    如果您需要查找您的 apache 用户,请查看:https://serverfault.com/questions/125865/finding-out-what-user-apache-is-running-as

    如果您的 apache 用户不同,请使用与上述相同的命令,但使用正确的用户。例如,如果你的 apache 用户是 httpd:

    su -s /bin/bash httpd
    

    【讨论】:

    • 表示系统中不存在该用户。就像我说的,apache 用户可以有不同的名字,这取决于你的发行版,你必须找出你的名字。
    • 我试过了,但我的 apache 用户没有密码,但他问我密码,所以我很困惑。有没有办法让 apache 用户访问我的 python 模块?
    • 您是否以 root 身份运行上述命令?它需要它才能工作。如果您以 root 身份运行它,它不应该要求您输入密码,因为它会覆盖 /etc/passwd 并以 Apache 身份启动 bash shell
    • 您还可以找到您的模块的安装位置:stackoverflow.com/questions/2927993/… 并授予 apache 对该目录的读权限,也可能是写权限。
    猜你喜欢
    • 2016-11-27
    • 1970-01-01
    • 2013-03-09
    • 1970-01-01
    • 1970-01-01
    • 2022-12-19
    • 2013-03-05
    • 1970-01-01
    • 2019-07-01
    相关资源
    最近更新 更多