如何使用PHP运行python脚本并创建文件?

时间:2018-05-08 04:35:05

标签: php python apache

我正在尝试在PHP中使用后端运行python脚本的POC。 Web服务器是Docker容器中的Apache。

这是PHP代码:

$command = escapeshellcmd('/usr/local/test/script.py');
        $output = shell_exec($command);
        echo $output;

当我使用后端执行python脚本时,我们收到了一个用于创建文件的权限被拒绝错误。

我的python脚本:

#!/usr/bin/env python

file = open("/tmp/testfile.txt","w+")

file.write("Hello World")

file.close()

这是我得到的错误:

  

IOError:[Errno 13]权限被拒绝:'testfile.txt'

对于使用权限的目录,如下所示,

  

drwxrwsr-x 2 1001 www-data 4096 5月8日05:35。

     

drwxrwxr-x 3 1001 1001 4096 5月3日08:49 ..

对此有何想法?我该如何克服这个问题?

2 个答案:

答案 0 :(得分:2)

开始是在任何脚本环境中拥有相对路径的非常糟糕的做法。首先,重写代码以使用完整路径,例如/usr/local/test/script.py/tmp/testfile.txt。我的猜测是你的剧本试图写到一个与你想象的不同的地方。

当您知道文件的确切位置时,请转到该目录并运行ls -la并检查该目录的权限。您希望它可以与Web服务器运行时由同一用户或组写入。

查看您显示的权限,您没有用户能够写入目录,只有每个人和组。您需要添加用户写入权限 - chmod u+w /tmp才能完成工作。

答案 1 :(得分:1)

我认为问题在于您正在尝试写入b目录中的现有文件。通常def f(n): X=np.random.uniform(-0.3,0.3,(n)) Y=np.random.uniform(-0.3,0.3,(n)) D=np.array(np.exp(1j*(5*np.pi/6)*np.abs((a+X[a])-(b+Y[b])))) D[diag,diag]=1-1j/np.sqrt(3) return D Ddiff = np.abs( np.dstack( inv( [f(n) for _ in range(500)] ) ) ) D2diff = gmean(Ddiff,axis=-1) will have the sticky permission bit set.这意味着只有文件的所有者才有权写入或删除它。如果在父目录上设置了粘滞位,则对文件的组写权限无关紧要。

所以如果这是你的/ tmp

的内容
/tmp/

我们可能会假设群组/tmp/中的用户应该能够写入$ ls -al /tmp drwxrwxrwt 5 root root 760 Apr 30 12:00 . drwxr-xr-x 21 root root 4096 Apr 30 12:00 .. -rw-rw---- 2 1001 www-data 80 May 8 12:00 testfile.txt 。但事实并非如此,因为www-data(/ tmp /目录本身)设置了粘滞位(权限部分中的testfile.txt表示这一点)。

这里设置粘滞位的原因是每个人都应该能够在那里写文件,但不必担心其他用户可能会修改我们的临时文件。

为避免权限错误,您可以使用标准库tempfile模块。此代码将创建一个唯一的文件名,例如.,因此t已存在并不重要。

testfile.JCDxK2.txt