PHP调用的python脚本无法编写

时间:2017-12-04 18:21:04

标签: php python shell

我已经设置了一个将用户数据传递给python脚本的小型Web应用程序。 Python应该开始工作,在Web服务器上创建一个文件,并允许用户下载它。但是,脚本执行似乎停止发出Python write()命令的位置。

的Python:

print("Writing to '" + filename + "'")
f = open('backups/' + filename, 'w')
f.write(self.output())
f.close()
print("Done!")

PHP:

$user = escapeshellarg($_POST['user']);
$password = escapeshellarg($_POST['password']);
$command = './backup.py '.$user.' '.$password;
print(exec($command));

实际结果:

  1. Python确实在所需目录中创建了一个文件,但它仍然是空的。 2. Python永远不会输出“完成!” (因为权限被拒绝)
  2. 预期结果:

    1. Python创建一个包含数据的文件
    2. Python继续打印“完成!”这是输出到调用PHP脚本
    3. 我已完成以下操作:

      1. www-data具有目录drwxrwsr-x
      2. 的组写权限(./backup
      3. #!/usr/bin/env python3 shebang出现在python文件中
      4. python文件是可执行的
      5. 当我使用sudo su www-data更改为用户www-data然后启动php命令行,并输入上述命令调用我的Python脚本时,文件正确创建!
      6. 如果我启动一个内置的php服务器,它也可以正常工作,只有当php脚本通过apache处理时才能正常工作

1 个答案:

答案 0 :(得分:1)

我已经正式浪费了一整天的生命。

权限没问题。 发生的事情是,如果python脚本是通过我的php脚本调用的,那么它只会失败,只有当它由Apache提供时才会失败。

查看Apache错误日志显示python脚本失败,因为它无法将字节写入文件而ascii转换失败,因为输出中有unicode数据。

这样做f = open(filename, 'wb')解决了这个问题。

在我的开发计算机上或通过内置的PHP服务器中未观察到此行为。仍然想知道为什么文件处理存在差异。如果有人有答案,我会很感激。