2017-07-01 297 views
1

在我機器上的本地Apache安裝程序上運行,並在Laravel外使用python。在Laravel中運行python腳本,腳本運行但不完全執行?

使用Laravel 5.4,我已經制作並註冊了該命令。我可以用php artisan python:printIt來稱呼它。

我在運行命令時取得了成功。 。 。但該文件沒有寫入!這裏是控制檯消息:

$ php artisan python:printIt在printIt的命令句柄中。運行 命令。命令是:C:\ Users \ Cortland \ Miniconda3 \ python.exe C:^ \ wamp64^\ www^\ cmrd^\ cgi-bin^\ py-test^\ printer.pySuccess。這裏是 的返回值:此消息來自python腳本.1

python腳本在通過python shell或命令行運行時很好。在這裏,必須運行該腳本,因爲它具有正確的print消息。但是,exec返回值是一個1,這是失敗。

由於沒有文件'pyfyle.txt'的存在而確認失敗。

我做錯了什麼,以及它如何被修復? 真正的應用程序將會涉及更多,但必須確保我可以先操作基本的腳本調用。

的Laravel命令類:

printIt.php

class printIt extends Command 
{ 
    protected $signature = 'python:printIt'; 

    protected $description = 'Run the test python command.'; 

    public function __construct() 
    { 
     parent::__construct(); 
    } 

    public function handle() 
    { 
     echo "In command handle for printIt.\n"; 
     exec("where python", $path); 

     $cmd = base_path('cgi-bin\py-test\printer.py'); 

     // "path/to/python command" 
     $run = $path[0] . ' ' . escapeshellcmd($cmd); 

     try { 
      echo "Running command.\n"; 
      echo "Command is : " . $run; 
      $res = exec($run, $out, $res); 

      if ($res == 1) { 
       throw \Exception("Could not run the sript"); 
      } else { 
       echo "Success. Here is the return value: ", print_r($res); 
      } 
     } catch (\Exception $e) { 
      echo "Error running command. It says " . $e->getMessage(); 
     } 
    } 
} 

的Python腳本:

printer.py

with open('pyfyle.txt', 'w', encoding='utf-8') as f: 
    f.write('new text here.') 
    f.close 

// Edit: error, incorrect call to close: change f.close to f.close() 

print("This message came from the python script..") 
+0

python腳本有什麼特權? Php以web用戶身份運行exec而不是root用戶。 –

+0

@Björn,很好的電話! 'ls -al'顯示我'-rw-r - r-- 1 Naltroc 197121 150 Jul 1 18:55 printer.py'。所以這意味着所有者:讀寫,組:讀,其他:讀內存服務。一般來說,設定他人執行是否安全?該腳本只能通過控制器或命令接口調用,因此看起來很安全。 。 。 – Naltroc

回答

0

這個問題是我做了關於Python版本的服務器運行的假設。

在家我使用Python 3.6。如果我剛開始在服務器上運行python -V,我將避免幾個小時的困惑和沮喪。

服務器在Python 2.6上運行,其中文件操作不相同。kwarg encoding無效,這足以破壞程序。

此外,我應該一直在打印$res以查看錯誤消息。

這個故事的寓意:

經常檢查軟件和軟件包的版本。

總是找到一種方法來顯示您的錯誤。