【问题标题】:Anaconda Permission Error When Using Subprocess to Call It From Default Ubunty Python使用子进程从默认的 Ubunty Python 调用它时出现 Anaconda 权限错误
【发布时间】:2019-08-01 12:54:29
【问题描述】:

我的目标是能够从 PHP 调用要执行特定 python 版本(conda 虚拟环境)的 python 脚本。

目前,我只能使用默认的 python 版本来执行它。 (2.7 和 3.6)。

因此,我从一个 php 脚本调用要在 python3 默认系统版本中执行的脚本,并从该脚本调用另一个脚本以通过 anaconda 虚拟环境执行。所以我尝试使用 subprocess 但它不起作用,并且我得到一个权限错误:

我从 php 调用 python 3 脚本 (python_transfer.py),然后从 python_transfer.py 调用脚本 (ptt.py) 以通过 python 的 anaconda 版本执行。

php 文件

$command = 'python3 /var/software/python_transfer.py';
exec($command,$output, $r);

ob_start();
exec($command . " 2>&1", $output);
$result = ob_get_contents();
ob_end_clean();

echo '<pre>';
print_r($output);
echo '</pre>';

python_transfer.py 文件:

import subprocess 
 output = subprocess.check_output(["/root/anaconda3/envs/10/bin/python3.6", "/var/software/ptt.py"])

ptt.py 文件:

print("this is a test")

输出:

[0] => Traceback (most recent call last):
[1] =>   File "/var/software/python_transfer.py", line 32, in 
[2] =>     output = subprocess.check_output(["/root/anaconda3/envs/10/bin/python3.6", "/var/software/ptt.py"])
[3] =>   File "/usr/lib/python3.6/subprocess.py", line 356, in check_output
[4] =>     **kwargs).stdout
[5] =>   File "/usr/lib/python3.6/subprocess.py", line 423, in run
[6] =>     with Popen(*popenargs, **kwargs) as process:
[7] =>   File "/usr/lib/python3.6/subprocess.py", line 729, in __init__
[8] =>     restore_signals, start_new_session)
[9] =>   File "/usr/lib/python3.6/subprocess.py", line 1364, in _execute_child
[10] =>     raise child_exception_type(errno_num, err_msg, err_filename)
[11] => PermissionError: [Errno 13] Permission denied: '/root/anaconda3/envs/10/bin/python3.6'

【问题讨论】:

    标签: php python python-3.x ubuntu anaconda


    【解决方案1】:

    看起来运行该 php 脚本(以及因此 python)的用户没有执行 python 的权限。也许尝试更改/root/anaconda3/envs/10/bin/python3.6 的权限?最简单但可能不是最佳实践的方法是运行 chmod 775 /root/anaconda3/envs/10/bin/python3.6 或运行 sudo,如果它不起作用。

    【讨论】:

      【解决方案2】:

      问题实际上是php用户的权限。它无权执行非默认 python。当我将 php 用户添加为具有与 root 相同的权限时它可以工作(出于安全原因,我猜这可能是不可取的)。

      命令应该是:

      $command = 'echo your_php_user_password | sudo -S /root/anaconda3/envs/10/bin/python3.6 /var/software/python_script.py';
      $exec($command,$output,$r);
      

      your_php_user_password 是 php 用户的密码。

      另外你必须给用户root权限,去编辑这个文件并在包含root设置的行下添加这一行(root ALL=(ALL:ALL) ALL):

      sudo visido
      php_user ALL=(ALL:ALL) ALL
      
      and then save, ctrl-O and then enter
      

      您编辑 visudo 文件,并赋予 php 用户更多权限。如果没有,php 将没有足够的权限来完成这项工作。

      【讨论】:

        猜你喜欢
        • 2020-12-18
        • 1970-01-01
        • 2018-05-04
        • 1970-01-01
        • 2019-02-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多