質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

1652閲覧

phpからpythonを実行し、その実行結果をphpで出力したい

tomoyuu

総合スコア7

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2019/08/26 02:47

編集2022/01/12 10:55

問題のコード

php

1//result.php 2<!DOCTYPE html> 3<html lang="ja" dir="ltr"> 4 <head> 5 <meta charset="utf-8"> 6 <?php include '..\db_config.php'; ?> 7 <title>result</title> 8 </head> 9 <body> 10 <?php 11 12 if(isset($_POST["name"])) 13 { 14 $name = $_POST['name']; 15 $per = $_POST['per']; 16 // echo $per; 17 try 18 { 19 $db = new PDO(PDO_DSN, DB_USERNAME, DB_PASSWORD); 20 $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 21 22 23 $stmt = $db->query("SELECT * FROM image ORDER BY id DESC LIMIT 1"); 24 $image_detail = $stmt->fetchAll(PDO::FETCH_ASSOC); 25 26 foreach($image_detail as $img_det) 27 { 28 $image_name = $img_det['name']; 29 // $image_id = $img_det['id']; 30 //image_detailに画像の情報を格納 31 $db->query("INSERT INTO `image_detail`(`img_id`,`quantity`,`kind`) VALUES({$img_det['id']},1,'{$name}')"); 32 } 33 34 $db = null; 35 } 36 catch(PDOException $e) 37 { 38 echo $e->getMessage(); 39 exit; 40 } 41} 42echo $name; 43$command="python harvests.py ".$image_name.""; 44// $command2="python harvests.py ".$name.""; 45 46 47exec($command,$output); 48// exec($command2,$output); 49 50print ("$output[0]"); 51 52 ?> 53 54 </body> 55</html> 56

python

1#harvests.py 2import cv2 3import numpy as np 4import os 5import tkinter 6import matplotlib 7matplotlib.use('tkagg') 8import matplotlib.pyplot as plt 9from matplotlib.patches import Circle, Polygon, Rectangle 10from tkinter import filedialog 11import sys 12 13time = sys.argv[1] 14text = "../Imagefile/fruit/{}.png" 15 16 17# 計算式----------------------------------------------------- 18class harvests(): 19 def __init__(self,area): 20 per_unitarea = area 21 distance = 27330/3081 - (2*per_unitarea)/3081 22 tree_area = 98 * distance + 336 23 harv = int(553/98 * tree_area - 3512) 24 self.msg = str(harv) 25# ----------------------------------------------------------- 26 27 28# img = Image.open(text.format(time)) 29 30 31# root = tkinter.Tk() 32# root.withdraw() 33# fTyp = [("Text File",".jpg")] 34# iDir = os.path.abspath(os.path.dirname(__file__)) 35# titleText = "Select image file" 36# image = filedialog.askopenfilename(filetypes = fTyp, title = titleText, initialdir = iDir) 37image = text.format(time) 38 39# GRAY_FILE_NAME = "gray.png" 40mono_image = "photo/エッジ検出.png" 41fgmask_img = "photo/マスク画像.png" 42mask_img = "photo/マスク合成後.png" 43 44# mono_image = "エッジ検出.png" 45# fgmask_img = "マスク画像.png" 46# mask_img = "マスク合成後.png" 47 48# 元の画像を読み込む 49org_img = cv2.imread(image, cv2.IMREAD_UNCHANGED) 50 51# グレースケールに変換 52gray = cv2.imread(image, 0) 53 54# 前処理(平準化フィルターを適用) 55# 前処理が不要な場合は下記行をコメントアウト 56# blur = cv2.GaussianBlur(gray, (5, 5), 2) 57 58# エッジ抽出 59edges = cv2.Canny(blur, 225, 255) 60# cv2.imshow("edges",edges) 61# エッジ検出後の画像を保存 62cv2.imwrite(mono_image, edges) 63 64 65# HSV変換 66im = cv2.imread(mono_image) 67hsv = cv2.cvtColor(im, cv2.COLOR_BGR2HSV) 68# cv2.imshow("hsv",hsv) 69# 赤色のHSV範囲 70hsv_min = np.array([0, 0, 0]) 71hsv_max = np.array([100, 100, 100]) 72mask = cv2.inRange(hsv, hsv_min, hsv_max) 73# 画像の黒部分の抽出 74m = cv2.countNonZero(mask) 75# 画像全体の縦横の長さの取得 76h, w = mask.shape 77 78# 画像の中心を求める 79w2 = int(w / 2) #横 80h2 = int(h / 2) #縦 81h23 = int(h / 2 * 0.9) #縦 82# 楕円の長辺短辺 83w3 = int(w * 0.33) #横 84h3 = int(h * 0.34) #縦 85 86cir_area = float(w3 * h3 * 3.1415) #楕円の面積 87# print (cir_area) 88 89im2 = cv2.imread(mono_image) 90hsv2 = cv2.cvtColor(im2, cv2.COLOR_BGR2HSV) 91# 回転角度 0°、円弧の範囲 0° ~ 360° 92# cir = cv2.ellipse(hsv, (w2,h23), (w3,h3), angle=0, startAngle=0, endAngle=360,color=(255, 0,0), thickness=-1) 93# cir = cv2.ellipse(hsv, (w2,h2), (w3,h3), angle=0, startAngle=0, endAngle=360,color=(255, 0,0), thickness=-1) 94# squ_w = (w2+150) - (w2-150) #抽出部分の 横 の長さ(でかい画像用) 95# squ_h = (h2-200) - (h2-500) #抽出部分の 縦 の長さ(でかい画像用) 96squ_w = (w2+25) - (w2-25) #抽出部分の 横 の長さ(ちっちゃい画像用) 97squ_h = (h2+20) - (h2-30) #抽出部分の 縦 の長さ(ちっちゃい画像用) 98 99# print(squ_w) 100# print(squ_h) 101# ↓でかい画像用 102# square = cv2.rectangle(hsv, (w2-150,h2-500), (w2+150, h2-200), (255, 0, 0), -1) 103square = cv2.rectangle(hsv, (w2-25,h2-30), (w2+25, h2+20), (255, 0, 0), -1) 104fill = cv2.rectangle(hsv2, (0,0), (w, h), (255, 0, 0), -1) 105# cv2.imshow("cir", cir) 106# cv2.imshow("fill", fill) 107 108#「背景差分」計算用オブジェクトの作成 109bgObj = cv2.bgsegm.createBackgroundSubtractorMOG() 110 111#差分となっている「前景領域」に対してマスクをかける 112fgmask = bgObj.apply(fill) 113fgmask = bgObj.apply(square) 114# fgmask = bgObj.apply(cir) 115# マスク画像の保存 116cv2.imwrite(fgmask_img, fgmask) 117#画面に表示 118# cv2.imshow('frame', fgmask) 119 120 121# マスク対象画像読み込み 122edges2 = cv2.imread(mono_image) 123# マスク画像読み込み 124imgMask = cv2.imread(fgmask_img, cv2.IMREAD_UNCHANGED) 125# edgesとfgmaskを合成 126edges2[imgMask==255] = [0,0,0] # マスク画像の明度 0 の画素を灰色(R:128 G:128 B:128)で塗りつぶす 127# cv2.imshow('img', edges2) 128cv2.imwrite(mask_img, edges2) 129 130# HSV変換 131hsv_mask_img = cv2.imread(mask_img) 132hsv_mask_img2 = cv2.cvtColor(hsv_mask_img, cv2.COLOR_BGR2HSV) 133# cv2.imshow("hsv",hsv) 134# 赤色のHSV範囲 135hsv_mask_img_min = np.array([0, 0, 0]) 136hsv_mask_img_max = np.array([100, 100, 100]) 137 138mask2 = cv2.inRange(hsv_mask_img2, hsv_mask_img_min, hsv_mask_img_max) 139# 画像の黒部分の抽出 140m2 = cv2.countNonZero(mask2) 141h_mask2, w_mask2 = mask2.shape 142 143# 単位面積あたりのエッジ量 --------------------------------------------- 144# エッジ量を抽出した部分の面積 145px = int(squ_h * squ_w) 146# print(px) 147# 白い部分(輪郭)のピスセル数の取得(単位面積当たりのエッジ量) 148area = round(h_mask2 * w_mask2 - m2) 149 150# 黒い部分(輪郭)の%の取得 151# per = round(100*float(area/px),3) 152# print("単位面積あたりのエッジ量[%]:",per) 153# print("単位面積内ののエッジ量[px]:",area) 154# cv2.imshow("Mask",mask) 155# ------------------------------------------------------------------ 156 157# 収穫個数計算結果の出力 158result = harvests(area) 159print result 160 161# 終了処理 162cv2.waitKey(0) 163cv2.destroyAllWindows() 164

現在しようとしていること

phpからpythonをexec関数で実行し、その実行結果をphpで受け取り表示をする。

起こっている問題

web上でresult.phpにアクセスしてもPOSTで受け取った$nameに入っている値だけが出力され、pythonの実行結果は全く帰ってこない。また、chromeのデベロッパーツールで見ても、エラーが起きているところはなく、どこがおかしいのかわからない。
何かおかしいところがあれば原因に繋がるかもしれないのでご教授いただけると幸いです。

補足

$nameなどのすべての変数に値は入っています。phpからpythonを呼び出す処理は

python

1import sys 2 3time = sys.argv[1] 4text = "../Imagefile/fruit/{}.png" 5 6print text.format(time)

のような簡単なpythonファイルを実行してみたが、ちゃんと値は返ってきていて表示もされたので、python側に問題があるのではと考えています。pythonがimportしているモジュールは、azure portalを使用しているので、その中にcv2:openCV、numpy、tkinter、matplotlibはインストールしてあります。(osとsysはインストールしなくても使えると聞きました。)

webサーバーのログ

2019-08-26 04:09:08 *** POST /app/result/result.php X-ARR-LOG-ID=c03d0b93-76b6-43b9-8b17-3e68ef83d64e 443 - 202.26.249.251 Mozilla/5.0+(iPhone;+CPU+iPhone+OS+12_3_1+like+Mac+OS+X)+AppleWebKit/605.1.15+(KHTML,+like+Gecko)+Version/12.1.1+Mobile/15E148+Safari/604.1 ARRAffinity=231057e07a83c4308bf983e7dc86c3ea07391dfcb2e933d9998a48444064ed8d https://****.azurewebsites.net/app/photo/camera.php ****.azurewebsites.net 200 0 0 642 1394 439 2019-08-26 04:09:08 *** GET /favicon.ico X-ARR-LOG-ID=bd45b987-cfb8-4c1f-8af6-c100203813f4 443 - 202.26.249.251 Mozilla/5.0+(iPhone;+CPU+iPhone+OS+12_3_1+like+Mac+OS+X)+AppleWebKit/605.1.15+(KHTML,+like+Gecko)+Version/12.1.1+Mobile/15E148+Safari/604.1 ARRAffinity=231057e07a83c4308bf983e7dc86c3ea07391dfcb2e933d9998a48444064ed8d https://****.azurewebsites.net/app/result/result.php ****.azurewebsites.net 404 0 2 418 1146 31 2019-08-26 04:09:14 *** GET /favicon.ico X-ARR-LOG-ID=563799a6-163f-4e7f-9776-5d7b89753ec8 443 - 202.26.249.251 Mozilla/5.0+(Macintosh;+Intel+Mac+OS+X+10_14_6)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/76.0.3809.100+Safari/537.36 ARRAffinity=231057e07a83c4308bf983e7dc86c3ea07391dfcb2e933d9998a48444064ed8d https://****.azurewebsites.net/app/result/result.php ****.azurewebsites.net 404 0 2 418 1236 15

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2019/08/26 02:54

当該コマンドを直接実行すると想定の情報は返ってくるのでしょうか。
tomoyuu

2019/08/26 02:57

ローカルのMACのターミナルでpythonファイルを単体で実行したときに、想定の情報が出力されました。
showkit

2019/08/26 03:18

「phpからpythonを呼び出す処理は...のような簡単なpythonファイルを実行してみたが、ちゃんと値は返ってきていて表示もされた」とありますが、そこの .php のソースを提示してもらえますか?違いがあるかもしれません。
tomoyuu

2019/08/26 03:25

上記のphpの$command="python harvests.py ".$image_name."";を$command="python harvests2.py ".$image_name."";に変更したぐらいです。その他は変わりありません。
otn

2019/08/26 03:49

> chromeのデベロッパーツールで見ても、エラーが起きているところはなく、 サーバーで起こっているエラーの詳細をブラウザで知ることはできません。サーバーのログを見ましょう。
showkit

2019/08/26 03:53

なるほど、python へのパスの問題かと思っていましたが、パスは通っているようですね。確かに python で起きているのであれば、otn さんのおっしゃるようにサーバのログなりを見るしかないですね。サーバに現在出ているログで足りなければ、python のソースにログを追加していくのが 面倒なようでも近道かと思います。
m.ts10806

2019/08/26 04:16

文字数許すならなるべく質問本文に追記いただきたいです
tomoyuu

2019/08/26 04:23

追記しました。
showkit

2019/08/26 04:24

エラーログの方には何も出ていませんか?
otn

2019/08/26 04:28

これはアクセスログでは?エラーログを見ましょう。
tomoyuu

2019/08/26 04:49

アプリケーションログとwebサーバーログしか項目がなくその中にもエラー文らしきものは見つかりませんでした。
退会済みユーザー

退会済みユーザー

2019/08/26 05:50

共用レンタルサーバーなのか、root権限のあるレンタルサーバーか、とかでも変わってきそう。共用レンタルサーバーなら、業者のドキュメント類をあたってwebサーバープロセスからpythonを呼び出せるのか確認してみることも忘れずに。
guest

回答1

0

Flaskはダメでしたか・・・。

execが失敗する原因で最も多そうなものが、「コマンドが見つからない」だと思いますので、以下のコードのpython部分を、フルパスで書いてみてはいかがですか?

php

1$command="python harvests.py ".$image_name."";

投稿2019/08/26 03:49

FiroProchainezo

総合スコア2387

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tomoyuu

2019/08/26 04:18

flaskをインストールしようとしたのですがエラーが出てよくわからなくなってしまったので、このような形になりました。他のpythonファイルでは今の状態のパスで通っていたので正しいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問