2017-07-01 11 views
1

私のマシン上でローカルApacheの設定で動作し、私はLaravelの外でpythonを使用します。LaravelでPythonスクリプトを実行すると、スクリプトは実行されますが、完全に実行されませんか?

Laravel 5.4を使用して、コマンドを作成して登録しました。私はそれをphp artisan python:printItを使ってうまく呼び出すことができます。

コマンドの実行に成功しました。 。 。ファイルは書き込みではありません!コンソールメッセージは次のとおりです。

$ php artisan python:printIt in printItのためのコマンドハンドルです。 Running コマンドコマンドは:C:¥Users¥Cortland¥Miniconda3¥python.exe C:¥¥wamp64¥¥www¥cmrd¥¥cgi-bin¥¥py-test¥¥printer.pySuccessです。ここでは 戻り値です:このメッセージは、Pythonスクリプトから来ました。

pythonスクリプトは、pythonシェルまたはコマンドラインを実行しても問題ありません。ここには、正しい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はrootではなくWebユーザーとしてexecを実行します。 –

+0

@Björn、よろしく! 'ls -al'は私に' -rw-r-r-- 1 Naltroc 197121 150 Jul 1 18:55 printer.py'を表示します。それは所有者を意味します:読み書き、グループ:読み込み、その他:メモリが使用されている場合に読み込みます。一般に、実行するように他の人を設定するのは安全ですか?このスクリプトは、コントローラまたはコマンドインターフェイスからのみ呼び出すことができるため、安全です。 。 。 – Naltroc

答えて

1

は、次のように入力します

sudo chmod +x printer.py 

Pythonスクリプトの実行権限を与える。

これはLinuxディストリビューションでは機能しますが、出力に「C:\」があることを確認すると、Windowsを実行していることを意味します。

場合:

あなたはPATHEXT環境変数にの.py追加する必要があります。

あたりとして:問題は、私は、サーバーが稼働していたのpythonのバージョンについての仮定をしていただったhttps://docs.python.org/3/faq/windows.html#how-do-i-make-python-scripts-executable

0

私はPython 3.6を使用しています。私が単純にサーバー上でpython -Vを実行したのであれば、何時間もの混乱と欲求不満を防ぎました。

サーバーは、ファイル操作が同じでないPython 2.6で動作します。kwarg encodingは無効です。これは、プログラムを中断するのに十分です。

また、エラーメッセージを表示するには、$resを印刷する必要があります。物語の

教訓:

は、必ずソフトウェアやパッケージのバージョンを確認してください。

エラーを表示する方法を常に見つけてください。

関連する問題