【问题标题】:Stuck at os.rename()卡在 os.rename()
【发布时间】:2015-04-02 04:58:33
【问题描述】:

我是ubuntu用户..我在php中有一个执行python文件的命令..python文件设置为可执行..所以,我的php命令是:-

 shell_exec("try.py");

python 文件位于桌面.. 但 php 文件位于 www 文件夹中..

 /var/www/try.php

在 try.py 中,我有一个代码来重命名桌面上的文件,如下所示:-

 print "enter"
 os.rename("a.txt", "b.txt")
 print "exit"

所以,try.py 和 a.txt 在桌面..

我的问题是,当我执行 php 文件时,它只显示“输入”但不显示“退出”..所以我猜它无法执行 os.rename 可能是因为 root 特权或我的任何东西不知道..我尝试了一些解决方案来禁用 sudo 的密码,但我仍然没有显示“退出”。

但是,如果我直接在桌面上双击执行try.py并执行它,命令可以完成,输出显示:-

enter
exit

那么,有谁知道如何使用 php 来执行它?

【问题讨论】:

  • 也许不要尝试 os.rename 进行测试,而是尝试 print "%s"%os.listdir(os.getcwd()) 之类的东西,看看它是否退出。

标签: php python html


【解决方案1】:

您可以使用rename 函数直接重命名php 中的文件。

rename($oldname, $newname);

【讨论】:

    【解决方案2】:

    问题是当您执行os.rename("a.txt", "b.txt") 时,它会在应用程序运行的目录中寻找a.txt(因此它会在/var/www/ 中寻找a.txt

    您应该同时提供a.txtb.txt 的完整路径:

    os.rename('/home/user/Desktop/a.txt', '/home/user/Desktop/b.txt')
    

    您还必须确保www-data(或任何运行 Apache 的用户)可以写入桌面目录;但是从安全角度来看,这是一个非常糟糕的主意 - 在服务器上运行的任何脚本都可以读取您桌面的内容(甚至删除文件)。

    【讨论】:

      【解决方案3】:

      终于,我得到了解决方案..

      为了能够使用 os.rename 在桌面重命名文件,我们需要编辑 sudoers 中的一些配置..

      它涉及 visudo 中的一些步骤以及 php 脚本..

      在 visudo 中(在终端中使用命令“sudo visudo”:)-

      #user privilege specification
      root All=(ALL:ALL) ALL
      www-data ALL=(ALL:ALL) ALL
      
      #includedir /etc/sudoers.d
      
      ubuntu ALL=(ALL) NOPASSWD: ALL //use your username.. mine is ubuntu
      www-data ALL=(ALL) NOPASSWD: ALL //the place where i put the php file
      

      在 php 文件中:-

      <?php
      $output = exec("sudo python /home/ubuntu/Desktop/[filename.py]");
      ?>
      

      对于python文件也是一样的..

      os.rename("a.txt", "b.txt")
      

      好的..这就是解决方案..现在我可以运行python脚本,它将从php更改桌面中文件的名称..

      感谢所有 cmets 和对解决方案的建议.. =))

      【讨论】:

        【解决方案4】:

        你需要这样的东西:

        my_dir = os.path.dirname(os.path.realpath(sys.argv[0]))
        

        这将等同于 try.py 实际所在的目录。

        然后就可以执行了:

        os.rename(os.path.join(my_dir, 'a.txt'), os.path.join(my_dir, 'b.txt'))
        

        如上所述,从安全 PoV 来看,这不一定是个好主意,因为您必须授予 php 脚本的写入权限。

        我通常也将 my_dir 代码放在 if sys.argv[0]: 中,这样我仍然可以从 python REPL 进行调试:

        if sys.argv[0]:
            # running as executable
            my_dir = os.path.dirname(os.path.realpath(sys.argv[0]))
        else:
            # imported into interpreter
            my_dir = '.'
        

        这样我仍然可以将模块导入到 REPL 中进行调试,只要我与相关文件位于同一目录中。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-06-07
          • 2014-02-02
          • 2018-11-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多