当脚本由 php 使用 shell_exec() 执行时'No module named ...'



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

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

问题是,我试图使用shell_exec("python test.py")用php脚本运行这个脚本,但后来我得到了一个错误,python不知道这个模块:

ImportError:没有命名的模块。。。

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


>编辑1:

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

ImportError:没有命名的模块。。。

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

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

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

作为另一种解决方案,您可以修复运行web服务器的帐户的外壳设置,使其与当前用户的设置相匹配。

干杯!

问题是,当您使用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

**包裹位置:**我认为主要的解决方案是将包安装在一个不需要太多访问权限的路径中。

将包安装在一条路径中;shell_exec";没有唯一的用户权限就可以访问。让我们玩一玩:

等包裹在哪里

whereis openai

您应该看到这样的内容:/home/USER/.local/bin/openai

如果这是终端上的输出,那么如果您以该用户的身份登录,代码应该可以很好地工作,但通过PHP/APACHE服务运行代码应该不起作用。

您需要将包复制到/usr/local/bin/openai。因此,将包文件复制并粘贴到/usr/local/bin/路径中。

**运行正确的版本:**还要确保在exec、shell_exec或system命令中调用的Python版本正确。

相关内容

最新更新